统计字典中特定列表的出现频率

4

假设我有一个字典:

thisdict = {
  "1": ['Vanilla','Chocolate']
  "2": ['Vanilla']
  "7": ['Chocolate']
  "8": ['Chocolate','Vanilla']
}

(注意:键是ID号码)

我想查看特定列表发生的频率,忽略元素的顺序。所以我想要我的结果是:

['Chocolate','Vanilla'] = 2
['Chocolate'] = 1
['Vanilla'] = 1

我该如何做到这一点?

现在我正在尝试使用Chief作为字典名称来查找值的频率:

track = {}

for key,value in chief.items():
    if value not in track:
        track[value]=0
    else:
        track[value]+=1

print(track)


但列表是不可哈希的,所以这样做行不通。 非常感谢您的帮助!

你可以将其转换为可哈希的元组。 - Julien
1
或者更好地将它们转换为集合,这样set(['Chocolate','Vanilla']) == set(['Vanilla','Chocolate']) - Selcuk
1
除了集合也不可哈希化... - Julien
4个回答

4

看起来你想以一种不考虑顺序的方式计算价值。你可以转换为一个set,但是sets不可哈希,这会让事情变得有点难。你可以使用frozenset,它是可哈希的,将允许['Chocolate','Vanilla']['Vanilla','Chocolate']被视为相同:

from collections import Counter

thisdict = {
  "1": ['Vanilla','Chocolate'],
  "2": ['Vanilla'],
  "7": ['Chocolate'],
  "8": ['Chocolate','Vanilla']
}

counts = Counter(map(frozenset, thisdict.values()))

counts将是一个计数器实例,例如:

Counter({frozenset({'Chocolate', 'Vanilla'}): 2,
     frozenset({'Vanilla'}): 1,
     frozenset({'Chocolate'}): 1})

1

由于顺序无关紧要,您可以将列表转换为frozenset,以便使用collections.Counter计算每组值的频率:

from collections import Counter

for combination, count in Counter(map(frozenset, thisdict.values())).items():
    print(f'{list(combination)} = {count}')

这将输出:

['Vanilla', 'Chocolate'] = 2
['Vanilla'] = 1
['Chocolate'] = 1

1
首先生成字典中所有列表的排序副本,然后将每个副本转换为元组,最后对每个元组进行哈希处理。这样可以更好地处理重复值,可能比使用集合更好。
test =[tuple(sorted(x)) for x in thisdict.values()]

创建一个等效的有序哈希表以进行查找:
mytable = [hash(x) for x in test])

然后在其上运行循环:
result = []
for item in test:
    count = 0
    for i, value in enumerate(mytable):
        if hash(item) == value and count == 0:
            count += 1
            result.append([item, count])
        elif hash(item) == value and count >= 1:
            result[:1][0][1] += 1
            test[i] = '(None)'
        else:
            pass

给出:

[[('Chocolate', 'Vanilla'), 2], [('Vanilla',), 1], [('Chocolate',), 1]]

0
FYI - 你的字典格式有问题,但一旦格式正确,你也可以用pandas相对简单地完成这个任务。
import pandas as pd
df = pd.DataFrame({'vals':[*thisdict.values()],'keys':[*thisdict.keys()]})

df

                   vals keys
0  [Vanilla, Chocolate]    1
1             [Vanilla]    2
2           [Chocolate]    7
3  [Chocolate, Vanilla]    8

out = df['vals'].apply(lambda x: tuple(sorted(x))).value_counts()

out

(Chocolate, Vanilla)    2
(Chocolate,)            1
(Vanilla,)              1
Name: vals, dtype: int64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接