计算任意数量的词典中最常见的值

Wor*_*rse 2 python python-3.x

我有数百个看起来像这样的词典.它们都有相同的键(纽约,芝加哥等......)但具有不同的值.没有遗漏的值.

[{'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'}]
Run Code Online (Sandbox Code Playgroud)

我想计算每个键最常见的"天气"值.然后将它们全部合并到一个最终列表中,该列表仅输出具有其最常见键值的每个城市.

{'New York': 'cloudy', 'Chicago': 'snowy', 'Seattle': 'rainy'}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Aja*_*234 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}
Run Code Online (Sandbox Code Playgroud)

输出:

{'New York': 'cloudy', 'Chicago': 'snowy', 'Seattle': 'rainy'}
Run Code Online (Sandbox Code Playgroud)

编辑:假设所有字典都d包含相同的键,只需要从列表中的第一个字典迭代后面的属性:

weather = {i:Counter([c[i] for c in d]).most_common(1)[0][0] for i in d[0]}
Run Code Online (Sandbox Code Playgroud)