在Python中构建频率字典中的列表列表

时间:2012-03-14 00:02:14

标签: python list corpus

我需要帮助找到一个快捷方式来构建频率字典中列表的频率排序列表。我可以通过将每个元素附加到列表然后将每个列表附加到“列表列表”(仅使用1-3频率)来构建列表列表(参见下文),但如果我有频率上升会发生什么到100或更多?!必须有更好的方法。

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

Python中的run副本如下所示:

[['de','cd','fg'],['ab','gh'],['ef','bc']]

这正是我想要的,但它不适用于频率为100+的100,000多个单词的语料库。请帮我找一个更好,更乏味的方法来建立我的清单。

5 个答案:

答案 0 :(得分: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},那么你就不必制作比你的记忆更大的列表,从而锁定你的机器。

答案 1 :(得分:0)

最好的方法:将它们全部扔进dict

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)

答案 2 :(得分:0)

你可以做类似的事情:

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)

{_ 1}}因为list_of_lists从0开始。动态列表的构造:-1称为list comprehension

答案 3 :(得分: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,则可能只从最终结果中减去一个,因此您不会在偏移零处得到一个空列表。

答案 4 :(得分: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解决方案相同的方法。它是功能性的:因此它更短 - 但理解它通常需要更长的时间。 : - )

评论:这是&#39;长&#39;因为恕我直言,dict / defaultdict构造函数(对于这个用途)太有限了。