我有几百个这样的字典。它们都具有相同的键(纽约,芝加哥等),但是具有不同的值。没有缺失值。
[{'New York': 'cloudy', 'Chicago': 'snowy', 'Seattle': 'rainy'},
{'New York': 'cloudy', 'Chicago': 'hailing', 'Seattle': 'sunny'},
{'New York': 'sunny', 'Chicago': 'snowy', 'Seattle': 'rainy'},
{'New York': 'hailing', 'Chicago': 'snowy', 'Seattle':'snowy'}]
我想为每个键计算最常见的“天气”值。然后将它们全部合并到一个最终列表中,该列表仅输出具有其最常用键值的每个城市。
{'New York': 'cloudy', 'Chicago': 'snowy', 'Seattle': 'rainy'}
我该如何实现?
答案 0 :(得分:8)
您可以遍历列表以将每个城市及其所有相关天气值分组,然后使用collections.Counter
:
from collections import Counter
d = [{'New York': 'cloudy', 'Chicago': 'snowy', 'Seattle': 'rainy'}, {'New York': 'cloudy', 'Chicago': 'hailing', 'Seattle': 'sunny'}, {'New York': 'sunny', 'Chicago': 'snowy', 'Seattle': 'rainy'}, {'New York': 'hailing', 'Chicago': 'snowy', 'Seattle': 'snowy'}]
weather = {i:Counter([c[i] for c in d]).most_common(1)[0][0] for b in d for i in b}
输出:
{'New York': 'cloudy', 'Chicago': 'snowy', 'Seattle': 'rainy'}
编辑:假设d
中的所有字典都包含相同的键,则仅需要从列表中的第一个字典开始迭代后面的属性:
weather = {i:Counter([c[i] for c in d]).most_common(1)[0][0] for i in d[0]}
答案 1 :(得分:2)
将您的词典列表转换为熊猫数据框,计算每个城市的值,找到最大值的索引:
import pandas as pd
typical = pd.DataFrame(your_list_of_dicts).apply(pd.value_counts).idxmax()
#Chicago snowy
#New York cloudy
#Seattle rainy
根据需要将其设为字典:
typical.to_dict()
#{'Chicago': 'snowy', 'New York': 'cloudy', 'Seattle': 'rainy'}
答案 2 :(得分:0)
那为什么不采用单线dictionary comprehension
?例如:
print({k:max([i[k] for i in weather],key=[i[k] for i in weather].count) for k in list(weather[0].keys())})
现在您将获得所需的输出:
{'New York': 'cloudy', 'Chicago': 'snowy', 'Seattle': 'rainy'}