web-dev-qa-db-ja.com

複数のリストに含まれるすべての値の和集合を作成するPythonの方法

リストのリストがあります:

lists = [[1,4,3,2,4], [4,5]]

このリストをフラット化し、すべての重複を削除します。または、言い換えると、集合和演算を適用します。

desired_result = [1, 2, 3, 4, 5]

これを行う最も簡単な方法は何ですか? (Python 2.4)を使用せざるを得ません)

61
AJ.

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つ以上のリストを使用してこれを行うこともできます。

119
sth

Python 2.5(itwouldを使用しているようですので、Aが必要な場合はQで言及してください。バージョン!= 2.6の場合、現在の本番バージョンです;-)結果としてセットではなくリストが必要です:

   import itertools

   ...

   return list(set(itertools.chain(*result_list)))

itertools は、一般的にイテレータ(および多くの種類のシーケンスまたはコレクション)を操作するのに最適な方法であり、慣れ親しむことをお勧めします。 itertools.chain、特に、文書化されています ここ

11
Alex Martelli

ユニオンは順序付けられたリストではサポートされていませんが、セットではサポートされています。 set.union を確認してください。

2
Justin R.

交差を行うために以下を使用しました。これにより、セットの必要がなくなりました。

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 ]
2
Bear

このスタイルに従うこともできます

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']    
1
GrvTyagi