言語は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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア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総合スコア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
総合スコア1149
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
もっとシンプルに書けるかもしれませんが、importなしで。
- ソート済みの共通項(set)を作る
- 1をイテレートして、その要素と同じものをa, bから取り出す(aa, bbとする)
- 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
総合スコア9388
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。