簡體   English   中英

計算字典中特定列表的頻率

[英]Count frequency of specific list in a dictionary

假設我有一本字典:

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)

但是列表不可散列,因此它不起作用。

非常感謝您的幫助!

您似乎想以一種順序無關緊要的方式來計算值。 您可以轉換為集合,但是集合不可散列,這會使操作變得更困難。 您可以使用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})

由於可以忽略順序,因此可以將列表轉換為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

首先如何生成dict中所有列表的排序副本,然后將每個列表轉換為元組,然后對每個元組進行哈希處理呢? 這應該處理重復的值,也許比集合更好:

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]]

僅供參考-您的字典格式不正確,但格式正確后,您也可以使用熊貓以相對簡單的方式做到這一點:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM