gpt4 book ai didi

python - 从 Python 中的频率字典构建列表列表

转载 作者:行者123 更新时间:2023-11-28 18:52:48 26 4
gpt4 key购买 nike

我需要帮助找到一个快捷方式来从频率字典中构建一个频率排序的列表列表。我可以通过将每个元素附加到列表然后将每个列表附加到“列表列表”来构建列表列表(见下文)(仅使用频率 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 中运行的副本如下所示:

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

这正是我想要的,但它不适用于包含 100,000 多个单词且频率为 100+ 的语料库。请帮助我找到一种更好、更简单的方式来构建我的列表列表。

最佳答案


解决方案 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},那么您就可以避免创建一个比您的内存还大的列表,从而避免锁定您的机器。

关于python - 从 Python 中的频率字典构建列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9694066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com