2012-03-14 16 views
3

頻度辞書からリストの頻度ソートリストを作成するためのショートカットを見つけるのに役立つ必要があります。私はリストのリストを作成することができます(下記参照)。リストに各要素を追加し、各リストをリストのリストに追加します。 100以上に!より良い方法が必要です。 Pythonでの実行のPythonで頻度辞書のリストを作成する

dictionary = {'ab':2, 'bc':3, 'cd':1, 'de':1, 'ef':3, 'fg':1, 'gh':2} 
list_1 = [] 
list_2 = [] 
list_3 = [] 
list_of_lists = [] 

for key, value in dictionary.items(): 
    if value == 1: 
      list_1.append(key) 
for key, value in dictionary.items(): 
    if value == 2: 
      list_2.append(key) 
for key, value in dictionary.items(): 
    if value == 3: 
      list_3.append(key) 

list_of_lists.append(list_1) 
list_of_lists.append(list_2) 
list_of_lists.append(list_3) 

print list_of_lists 

コピーは次のようになります。

[[ 'ド'、 'C​​D'、 'FG']、[ 'AB'、 'GH']、[ 'EF'、 'bc']]

これは私が欲しいものですが、100,000以上の単語のコーパスが100+以上の場合は機能しません。リストの私のリストを構築するための、より良い、より退屈な方法を見つけるのを助けてください。

答えて

0

ベストな方法:ややシンプルな辞書

result = {} 

for key, value in dictionary.iteritems(): 
    if not value in result: 
    result[value] = [] 
    result[value].append(key) 

にそれらのすべてを投げる:

from collections import defaultdict 
result = defaultdict(list) 

for key, value in dictionary.iteritems(): 
    result[value].append(key) 

またはリストを作成するには:

result = [[]] * max(dictionary.values()) 

for key, value in dictionary.iteritems(): 
    result[value-1].append(key) 
+0

この方法でリストを作成すると、頻度値がまばらな場合に最適化できません。 –

+0

私はOPがこれを望んでいると思う...すべての要素が対応するオフセットに格納されているリスト。 – hochl

+0

ありがとう、bluepnume。ここで3番目の解決策は、後で必要とする形式のリストです(インデックスを呼び出すことによって各リストを使用します)。 – Jackie

0
dict_of_lists = {} 

for key, value in dictionary.items(): 
    if value in dict_of_lists: 
     dict_of_lists[value].append(key) 
    else: 
     dict_of_lists[value] = [key] 

list_of_lists = dict_of_lists.values() 
+0

dict.values()を使用するだけでは、必ずしも意味のある方法でソートされた結果が保持されるとは限りません。 – bluepnume

+0

'list_of_lists = map(lambda x:x [1]、sorted(dict_of_lists.items()))'をソートしたい場合は、 '。 –

+0

私はプログラミングに新しいので、 "地図"は私にはっきりしていません...私はいくつかの研究を行い、それを理解しようとします...ありがとう、ラファル! – Jackie

0

あなたはシンプル行うことができますそのようなもの:

01 list_of_lists以来 -1
dictionary = {'a1':2, ..., 'g':100} 
MAX_FREQUENCE = max([dictionary[k] for k in dictionary]) //find the max frequency 
list_of_lists=[[] for x in range(MAX_FREQUENCE] //generate empty list of lists 
for k in dictionary: 
    dictionary[d[k]-1].append(k) 

は0オンザフライでリストの構築を開始します:[f(x) for x in iterable]list comprehensionと呼ばれています。

+0

周波数が100を超えている場合、これは機能しますか?私は最大周波数が何であるか分からない。 – Jackie

+0

@Jackie私は最初に最大値を見つけるために私の答えを更新しました – Zenon

1

ソリューション1からリスト - リストのあなたは、ヒストグラムのようなものを探しています(を求めていたもの)

を経由して逆マッピングが、逆。

def inverseHistogram(valueFreqPairs): 
    maxFreq = max(p[1] for p in valueFreqPairs)+1 
    R = [[] for _ in range(maxFreq)] 
    for value,freq in valueFreqPairs: 
     R[freq] += [value] 
    return R 

デモ:

>>> inverseHistogram(dictionary.items()) 
[[], ['de', 'cd', 'fg'], ['ab', 'gh'], ['ef', 'bc']] 

ソリューション2から逆マッピングあなたは辞書を使用して満足している場合

さらに良いdefaultdictパターン(非常にクリーン)を経由して逆を整理する(よりエレガントなように見える)。これが私が個人的にやる方法です。

reverseDict = collections.defaultdict(list) 
for value,freq in dictionary.items(): 
    reverseDict[freq].append(value) 

デモ:

>>> dict(reverseDict) 
{1: ['de', 'cd', 'fg'], 2: ['ab', 'gh'], 3: ['ef', 'bc']} 

追記:たとえば、あなたの周波数が疎である場合、これはまた、例えば、あなたのスペースを節約しますあなたの入力が{'onlyitem':999999999}だった場合は、あなたのメモリよりも大きなリストを作る必要がなくなるので、マシンをロックすることができます。

+0

ありがとう、ninjagecko、私はヒストグラムも見てみる必要がありますように見えます! – Jackie

0

あなたは自分のデータを格納するために、デフォルトの辞書を使用することができます。

import collections 

dictionary={'ab':2, 'bc':3, 'cd':1, 'de':1, 'ef':3, 'fg':1, 'gh':2} 
lists_by_frequency=collections.defaultdict(list) 
for s, f in dictionary.iteritems(): 
     lists_by_frequency[f].append(s) 
list_of_lists=[[] for i in xrange(max(lists_by_frequency)+1)] 
for f, v in lists_by_frequency.iteritems(): 
     list_of_lists[f]=v 
print lists_by_frequency 
print list_of_lists 

出力:あなたが見ることができるように

defaultdict(<type 'list'>, {1: ['de', 'cd', 'fg'], 2: ['ab', 'gh'], 3: ['ef', 'bc']}) 
[[], ['de', 'cd', 'fg'], ['ab', 'gh'], ['ef', 'bc']] 

、各グループがその周波数のインデックスに格納されています。頻度が少なくとも1つであれば、最終結果から1を引くだけで、オフセット0で空のリストを取得することはできません。

0

官能方法:

import collections 

dictionary = {'ab':2, 'bc':3, 'cd':1, 'de':1, 'ef':3, 'fg':1, 'gh':2} 

ldict = collections.defaultdict(list) 
map(lambda (k, v): ldict[v].append(k), dictionary.iteritems()) 
list_of_lists = map(lambda x: ldict[x], xrange(0, max(ldict)+1)) 

print(list_of_lists) 

この溶液をhochlからの溶液と同じ方法を使用します。それは機能的です:したがって、それは短いです - しかし、それを理解するために典型的に時間がかかります。 :-)

コメント:IMHOのdict/defaultdictコンストラクタが(この用途のために)あまりにも限られているため、「長い」です。

関連する問題