从字典列表中查找字典键的频率

时间:2020-08-05 07:21:52

标签: python python-3.x dictionary

我应该在词典列表中找出不同键的频率。

例如:

词典输入列表:

[{'p1': 'val1', 'p2': 'val2', 'p3': 'val3', 'p4': 'val4'},
 {'p1': 'val5', 'p7': 'val6', 'p3': 'val7'},
 {'p1': 'val8', 'p2': 'val9', 'p9': 'val10', 'p7': 'val11'}]

输出格式:字典,键为输入字典中看到的键,而值为包含频率的列表和输入中看到的值的列表。输出中的键顺序无关紧要。

输出:

{'p1': [3, ['val1', 'val5', 'val8']],
 'p2': [2, ['val2', 'val9']],
 'p3': [2, ['val3', 'val7']],
 'p4': [1, ['val4']],
 'p7': [2, ['val6', 'val11']],
 'p9': [1, ['val10']]
}

是否有一种有效的方法来做到这一点? 非常感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

这是获得所需输出的简单方法:

result = {}
for d in list_of_dicts:
    for k, v in d.items():
        result.setdefault(k, [0, []])
        result[k][0] += 1
        result[k][1].append(v)

答案 1 :(得分:1)

这是一个可能的解决方案(lst是您的原始输入):

from collections import defaultdict

dct = defaultdict(lambda: [0, []])
for d in lst:
    for key, value in d.items():
        dct[key][1].append(value)
        dct[key][0] += 1
dct = dict(dct)

dct中包含的结果:

{'p1': [3, ['val1', 'val5', 'val8']],
 'p2': [2, ['val2', 'val9']],
 'p3': [2, ['val3', 'val7']],
 'p4': [1, ['val4']],
 'p7': [2, ['val6', 'val11']],
 'p9': [1, ['val10']]}

答案 2 :(得分:0)

这是使用pandas

的解决方案
import pandas as pd

#Your dataset
d1 = [
    {'p1': 'val1', 'p2': 'val2', 'p3': 'val3', 'p4': 'val4'},
    {'p1': 'val5', 'p7': 'val6', 'p3': 'val7'},
    {'p1': 'val8', 'p2': 'val9', 'p9': 'val10', 'p7': 'val11'}]

#Read the dataset into a dataframe
df1 = pd.DataFrame(data=d1)

myDict = dict()
#Iterate over the columns and add to a dictionary the elaborated values removing the nan
for label, content in df1.iteritems():
    myContent = [content for content in content if str(content) != 'nan']
    myDict[label] = [len(myContent), myContent]

print myDict

结果:

{'p2': [2, ['val2', 'val9']], 'p3': [2, ['val3', 'val7']], 'p1': [3, ['val1', 'val5', 'val8']], 'p7': [2, ['val6', 'val11']], 'p4': [1, ['val4']], 'p9': [1, ['val10']]}