2017-09-12 19 views
-1

以下の例に示すように、単語のペアを持つ5つの長いリストがあります。これは今、私は単語ペアの頻度を計算したい[['Bread', 'Oil'], ['Bread', ' Salt']]Pythonで複数のリストを効率的に比較する

list_1 = [ [['Salad', 'Fat']], [['Bread', 'Oil'], ['Bread', 'Salt']], [['Salt', 'Sugar'] ] 
list_2 = [ [['Salad', 'Fat'], ['Salt', 'Sugar']], [['Protein', 'Soup']] ] 
list_3 = [ [['Salad', ' Protein']], [['Bread', ' Oil']], [['Sugar', 'Salt'] ] 
list_4 = [ [['Salad', ' Fat'], ['Salad', 'Chicken']] ] 
list_5 = [ ['Sugar', 'Protein'], ['Sugar', 'Bread'] ] 

のようなリストの[['Salad', 'Fat']]、ワードペアのリストのような単語のペアのリストを含むことができることに注意してください。

たとえば、上記の5つのリストでは、次のように出力する必要があります。ここでは、単語のペアとその頻度が示されています。

output_list = [{'['Salad', 'Fat']': 3}, {['Bread', 'Oil']: 2}, {['Salt', 'Sugar']: 2, 
{['Sugar','Salt']: 1} and so on] 

Pythonで最も効果的な方法は何ですか?

+0

の異なる入れ子のレベルがあります外側のリスト内のペア? – jlandercy

+2

これを実行する最も効率的な方法は、おそらく元のリストを構築するより良い仕事をすることです。そのため、さまざまなレベルの入れ子リストのミッシュマッシュはありません。あなたは彼らがどのように建てられたかを教えてくれますか? –

+1

変更可能なオブジェクトを辞書キーとして使用することはできません –

答えて

1

のように記述することができます。

collections.Counter()は、この種のもののために構築されていますがlist sがあなたがtuple S(だけでなく、スプリアススペースオフstrip)にそれらを有効にする必要がありそうハッシュ可能されていません。

In []: 
import itertools as it 
from collections import Counter 

list_1 = [ [['Salad', 'Fat']], [['Bread', 'Oil'], ['Bread', 'Salt']], [['Salt', 'Sugar'] ]] 
list_2 = [ [['Salad', 'Fat'], ['Salt', 'Sugar']], [['Protein', 'Soup']] ] 
list_3 = [ [['Salad', ' Protein']], [['Bread', ' Oil']], [['Sugar', 'Salt'] ]] 
list_4 = [ [['Salad', ' Fat'], ['Salad', 'Chicken']] ] 
list_5 = [ ['Sugar', 'Protein'], ['Sugar', 'Bread']] 

t = lambda x: tuple(map(str.strip, x)) 
c = Counter(map(t, it.chain.from_iterable(it.chain(list_1, list_2, list_3, list_4)))) 
c += Counter(map(t, list_5)) 
c 

Out[]: 
Counter({('Bread', 'Oil'): 2, 
     ('Bread', 'Salt'): 1, 
     ('Protein', 'Soup'): 1, 
     ('Salad', 'Chicken'): 1, 
     ('Salad', 'Fat'): 3, 
     ('Salad', 'Protein'): 1, 
     ('Salt', 'Sugar'): 2, 
     ('Sugar', 'Bread'): 1, 
     ('Sugar', 'Protein'): 1, 
     ('Sugar', 'Salt'): 1}) 
+0

ありがとうございました。しかし、あなたのコードでは 'それは何ですか?それをインポートする必要がありますか? –

+1

私はそれが 'itertools as it 'だと思います –

+2

申し訳ありません、ありがとうございます@Volka。私は頻繁にそれを使用して、それはほとんど潜在意識、 'itertoolsそれ'、 'functoolsとしてft'、'オペレータop'と他のよく確立numpyとしてnp'、 'pandasとしてpd'を使用します。 – AChampion

1

flattenすべてのリストです。次に、Counterを使用して単語の頻度を数えます。

>>> import itertools 
>>> from collections import Counter 
>>> l = [[1,2,3],[3,4,1,5]] 
>>> counts = Counter(list(itertools.chain(*l))) 
>>> counts 
Counter({1: 2, 3: 2, 2: 1, 4: 1, 5: 1}) 

注:この平坦化手法は、リストのリストでのみ機能します。他の平坦化技術については、上記のリンクを参照してください。

EDIT:AChampion counts = Counter(list(itertools.chain(*l)))へ おかげで、あなたがこのコードは醜いなりますので、入力リストを修正することになり、凹凸ネストされたリストを持って考えるとcounts = Counter(list(itertools.chain.from_iterable(l)))

+0

'itertools.chain.from_iterable(l)'は、アンパックよりも優れています。 – AChampion

+0

これはもっと明白なのでこれを言っていますか? @AChampion – marcusshep

+0

また、より速く、仕事のために構築されています。 – AChampion

関連する問題