2016-05-04 11 views
4

最初の要素を含む最も頻繁なタプルのリストを作成しようとしています。 dは私の辞書である場合 :たとえば最初の要素を含む最も頻繁なタプルのリストを作成する

d = {(Hello, my): 1,(Hello, world):2, (my, name):3, (my,house):1} 

私はこのようなリストを取得したい:

L= [(Hello, world),(my, name)] 

だから私はこの試してみてください。

L = [k for k,val in d.iteritems() if val == max(d.values())] 

をしかし、それは私だけを与えますすべてのタプルの最大値:

L = [('my', 'name')] 

私は辞書を読んで、各タプルの最初の単語ごとに新しいものを作ってから、最も頻繁に見つけてリストに入れなければならないかもしれないと思っていましたが、コード。

+1

ネクタイの場合はどうしますか? – wim

+2

あなたはなぜ出力が 'L = [(Hello、world)、(my、name)]'であるべきか私を説明できますか?何を言っているのかわかりません – Milor123

答えて

2

最初の単語オフあなただけの再キーマッピング場合、これは(n)は、Oで達成可能である:

>>> d = {('Hello','my'): 1, ('Hello','world'): 2, ('my','name'): 3, ('my','house'): 1} 
>>> d_max = {} 
>>> for (first, second), count in d.items(): 
...  if count >= d_max.get(first, (None, 0))[1]: 
...   d_max[first] = (second, count) 
...   
>>> d_max 
{'Hello': ('world', 2), 'my': ('name', 3)} 
>>> output = [(first, second) for (first, (second, count)) in d_max.items()] 
>>> output 
[('my', 'name'), ('Hello', 'world')] 
0

私の意見では、すべてのd値を最大値にするだけではなく、指定したケースで3つの辞書に含まれる最大値を取得するだけです。 私がやることは、中間のリスト(おそらくこれは隠すことができます)を作成して、キーの最初の部分を2番目の要素として、カウンタを最初の要素としてメモリに保持することです。このようにソートされたリストの最初の要素を取得して、実際の最大キーを取得することができます。

3
from itertools import groupby 

# your input data 
d = {('Hello', 'my'): 1,('Hello', 'world'):2, ('my', 'name'):3, ('my','house'):1} 

key_fu = lambda x: x[0][0] # first element of first element, 
          # i.e. of ((a,b), c), return a 

groups = groupby(sorted(d.iteritems(), key=key_fu), key_fu) 
l = [max(g, key=lambda x:x[1])[0] for _, g in groups] 
0

あなたは言葉やそれらのそれぞれに関連したカウントのペアを持っています。あなたにはあなたの情報を格納することができ(または、それはに変換する)3つのタプル:

d = [ 
    ('Hello', 'my', 1), 
    ('Hello', 'world', 2), 
    ('my', 'name', 3), 
    ('my', 'house', 1) 
] 

各単語の最初の位置に、あなたは第二の位置に単語を見つけたい、最も頻繁に発生します。最初の単語(任意の順序、それらをグループ化する)、次にカウント(降順)に従ってデータをソートします。

d.sort(lambda t1,t2: cmp(t2[2],t1[2]) if (t1[0]==t2[0]) else cmp(t1[0],t2[0])) 

最後に、遭遇した最後の言葉を追跡し、結果の配列を反復処理し、第一の位置に新しい単語に遭遇したときにのみ追加します。

L = [] 
last_word = "" 
for word1, word2, count in d: 
    if word1 != last_word: 
    L.append((word1,word2)) 
    last_word = word1 

print L 

このコードを実行すると、[('Hello', 'world'), ('my', 'name')]が取得されます。

関連する問題