あなたは本当にしたいですset。セットは一意の要素のみを含むことができ、ハッシュ テーブルとして実装できるため、リストよりも高速です。ハッシュ テーブルによりif element in my_set、時間内にメンバーシップ テスト ( ) が可能になりO(1)ます。これはリストとは対照的です。リストでは、要素がリストにあるかどうかを確認する唯一の方法は、リストのすべての要素を順番に (O(n)時間内に) チェックすることです。
は、両方とも一意のキーのみを許可し、両方ともハッシュ テーブルとして実装されるという点で に似dictています。どちらもメンバーシップのテストsetを許可します。O(1)違いは、 asetにはキーしかないのに対し、 adictにはキーと値の両方があることです (これは、このアプリケーションでは不要な余分なオーバーヘッドです)。
を使用しset、ネストされた for ループを に置き換えてitertools.chain()、2D リストを 1D リストにフラット化します。
import itertools
seen = set()
for author in itertools.chain(*authors):
seen.add(author)
または短い:
import itertools
seen = set( itertools.chain(*authors) )
大きなリストのメモリ効率を高める編集 (@jamylak に感謝):
import itertools
seen = set( itertools.chain.from_iterable(authors) )
リストのリストの例:
>>> a = [[1,2],[1,2],[1,2],[3,4]]
>>> set ( itertools.chain(*a) )
set([1, 2, 3, 4])
PS : すべての一意の著者を見つける代わりに、各著者に会った回数を数えcollections.Counterたい場合は、ものを数えるために最適化された特別な種類の辞書である を使用します。
文字列内の文字数をカウントする例を次に示します。
>>> a = "DEADBEEF CAFEBABE"
>>> import collections
>>> collections.Counter(a)
Counter({'E': 5, 'A': 3, 'B': 3, 'D': 2, 'F': 2, ' ': 1, 'C': 1})