【问题标题】:Group values by keys in list of dictionaries按字典列表中的键对值进行分组
【发布时间】:2021-11-23 18:40:30
【问题描述】:

我有什么:

d = {datetime.date(2013, 1, 1): {'15169': 2, '56203': 5, '2519': 3, '18144': 3, '9737': 4},
datetime.date(2014, 1, 1): {'15169': 5, '56203': 3, '2519': 2, '18144': 1, '9737': 0}}

我想要什么:

{15169:[2,5], 56203:[5,3], 2519:[3,2], 18144:[3,1], 9737:[4,0]}

是否有任何直接的方法来实现这一点? 尝试了多种方法,但似乎没有任何直接的方法。

【问题讨论】:

  • 这取决于你认为什么是直截了当的。
  • 我认为迭代d 中的字典并将包含的值附加到结果字典中的相应列表中很简单。
  • “尝试了多种方法,但似乎没有任何直接的方法。”你尝试了哪些方法?为什么你认为他们“不直截了当”?

标签: python dictionary group-by


【解决方案1】:
ans = {}
[[ans.setdefault(k, []).append(v) for k, v in x.items()] for x in d.values()]
ans
# {'15169': [2, 5],
#  '56203': [5, 3],
#  '2519': [3, 2],
#  '18144': [3, 1],
#  '9737': [4, 0]}

或者使用熊猫

pd.DataFrame(d).apply(list, axis=1).to_dict()
# {'15169': [2, 5],
#  '56203': [5, 3],
#  '2519': [3, 2],
#  '18144': [3, 1],
#  '9737': [4, 0]}

【讨论】:

    【解决方案2】:

    尽可能简单,使用defaultdict

    from collections import defaultdict
    
    out = defaultdict(list)
    
    for x in d.values():
        for k,v in x.items():
            out[k].append(v)
    

    输出:

    defaultdict(list,
                {'15169': [2, 5],
                 '56203': [5, 3],
                 '2519': [3, 2],
                 '18144': [3, 1],
                 '9737': [4, 0]})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-17
      • 2020-03-03
      • 2019-12-30
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多