【问题标题】:Counting most common value in Arbitrary number of dictionaries在任意数量的字典中计算最常见的值
【发布时间】:2018-11-16 04:34:05
【问题描述】:

我有数百个类似这样的字典。它们都具有相同的键(纽约、芝加哥等),但具有不同的值。没有缺失值。

[{'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'}

我怎样才能做到这一点?

【问题讨论】:

  • 请向我们展示您的代码。

标签: python python-3.x


【解决方案1】:

您可以遍历列表以将每个城市与其所有相关的天气值分组,然后使用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]}

【讨论】:

  • 如果所有字典的键都相同,你真的每次都需要for b in d for i in b吗?你不能只有for i in d[0]吗?这将使它更快
  • @slider 好点。我最初使用for b in d for i in b 尽可能地健壮,但是,我还添加了您的建议作为编辑。后者当然效率更高。
【解决方案2】:

将您的字典列表转换为 pandas DataFrame,计算每个城市的值,找到最大值的索引:

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'}

【讨论】:

    【解决方案3】:

    那为什么不是单行 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'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多