質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

4871閲覧

[python] リストの重複を許した共通部分を求めたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2016/06/09 13:38

言語はpython3.xです。
A=["a","b","b","c"], B=["b","b","c","d"]の共通部分をsetやら&やらを使って求めると{"b","c"}となります。
しかし私がほしいのは["b","b","c"]というように重複を許した共通部分なんです。
どうやったらこのような重複を許した共通部分が求められるでしょうか。
ほかの例) A=["a","a","a","a","b","b","c","d"]
B=["a","a","a","b","c","c"]
求めたい奴["a","a","a","b","c"]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

要素の順序が失われてもよければ collections.Counter を利用できます。

Python

1from collections import Counter 2A = ["a","b","b","c"] 3B = ["b","b","c","d"] 4C = list((Counter(A) & Counter(B)).elements()) 5print(C) 6

投稿2016/06/09 14:56

yohhoy

総合スコア6189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

けっこうごちゃごちゃしている感じになってしまいましたが、こんなのでしょうか?

Python

1import functools 2a = ["a", "a", "a", "a", "b", "b", "c", "d"] 3b = ["a", "a", "a", "b", "c", "c"] 4print(functools.reduce(lambda t, x: (t[0] + [x], [y for i, y in enumerate(t[1]) 5 if i != t[1].index(x)]) if x in t[1] else t, a, ([], b))[0])

aとbを書き換えないようにするため、reduceを使って、aの要素を追加した新しい配列を作りながら、bからは削除した新しい配列を作る、そしてタプルで渡していくという処理をしています。

投稿2016/06/09 14:40

編集2016/06/09 14:43
raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

厳密でなくてもよければdifflibを使ってみるとか。

python

1import difflib 2 3a = 'a a a a b b c d'.split() 4b = 'a a a b c c'.split() 5c = [x[2:] for x in difflib.ndiff(a, b) if x[0] == ' '] 6print('a =', a) 7print('b =', b) 8print('c =', c) 9 10#output: 11# a = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'd'] 12# b = ['a', 'a', 'a', 'b', 'c', 'c'] 13# c = ['a', 'a', 'a', 'b', 'c']

投稿2016/06/09 15:21

sharow

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

もっとシンプルに書けるかもしれませんが、importなしで。

  1. ソート済みの共通項(set)を作る
  2. 1をイテレートして、その要素と同じものをa, bから取り出す(aa, bbとする)
  3. aaとbbの要素の少ない方を採用する

lang

1def f(a, b): 2 result = [] 3 for i in sorted(set(a + b)): 4 aa = [x for x in a if x == i] 5 bb = [x for x in b if x == i] 6 result += aa if len(aa) < len(bb) else bb 7 return result 8 9a=["a","b","b","c"] 10b=["b","b","c","d"] 11print(f(a, b)) 12# ['b', 'b', 'c'] 13 14a=["a","a","a","a","b","b","c","d"] 15b=["a","a","a","b","c","c"] 16print(f(a, b)) 17# ['a', 'a', 'a', 'b', 'c']

上のを全部、内包表記に押し込めたバージョン。

lang

1def f(a, b): 2 return [item for nested in 3 [min([x for x in a if x == i], 4 [x for x in b if x == i], key=len) 5 for i in sorted(set(a + b))] for item in nested]

投稿2016/06/09 14:59

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問