私はリストのリストを持っています:
lists = [[1,4,3,2,4], [4,5]]
このリストをフラットにして、すべての重複を削除したいと思います。または、言い換えると、集合和集合演算を適用します。
desired_result = [1, 2, 3, 4, 5]
これを行う最も簡単な方法は何ですか?
回答:
set.union
あなたが望むことをします:
>>> results_list = [[1,2,3], [1,2,4]]
>>> results_union = set().union(*results_list)
>>> print(results_union)
set([1, 2, 3, 4])
3つ以上のリストでこれを行うこともできます。
union()
Pythonバージョン2.6以降では複数の引数のみがサポートされています。その前のバージョンを使用しているように見えるので、おそらく明示的なループを使用する必要があります:total = set(); for x in results_list: total.update(x)
(s /; / \ n /)
results_union = set.union(*(set(el) for el in results_list))
TypeError: descriptor 'union' requires a 'set' object but received a 'list'
Jean-少なくともPython3.6のFrançoisFabre 。
set.union(*results_list)
場合は、メソッド記述子を手動でバインドします。つまり、の最初の要素をresults_list
「self」として送信します。これにより、いくつかの奇妙な制限が発生します。1。ダックタイピングが適切に行われない(最初の要素はセットまたはセットサブクラスのインスタンスである必要があります)、2。空の和集合はresults_list
エラーになります(誤った結果-空を返す必要があります)セットする)。
itertools
パッケージに浸る良い時間の完璧な例。
itertools.chain
ちなみに、Python2.4でも問題なく動作します。
このスタイルに従うこともできます
In [12]: a = ['Orange and Banana', 'Orange Banana']
In [13]: b = ['Grapes', 'Orange Banana']
In [14]: c = ['Foobanana', 'Orange and Banana']
In [20]: list(set(a) | set(b) | set(c))
Out[20]: ['Orange and Banana', 'Foobanana', 'Orange Banana', 'Grapes']
In [21]: list(set(a) & set(b) | set(c))
Out[21]: ['Orange and Banana', 'Foobanana', 'Orange Banana']
ユニオンは、順序付けられたリストではサポートされていませんが、セットではサポートされています。set.unionをチェックしてください。
私は以下を使用して交差を行いました。これにより、セットが不要になります。
a, b= [[1,2,3], [1,2]]
s = filter( lambda x: x in b, a)
または、
s = [ x for x in b if x in a ]