首页 > 解决方案 > python:基于相似键的dict groupby列表然后过滤

问题描述

我有一个字典列表,例如:

data = [
  {'11': {'x': 333, 'priority': 1, 'channels': 40}}, 
  {'11': {'x': 444, 'priority': 2, 'channels': 30}}, 
  {'22': {'x': 000, 'priority': 1, 'channels': 55}}
]

我想对具有相似键的 dict 元素进行分组,例如:

 [
   [{'11': {'x': 333, 'priority': 1, 'channels': 40}}, 
    {'11': {'x': 444, 'priority': 2, 'channels': 30}}], 
   [{'22': {'x': 000, 'priority': 1, 'channels': 55}}]
 ]

priority如果 group-by 列表中包含超过 1 个元素,则在 key 上过滤 dict 元素。

期望输出:

 [
   {'11': {'x': 333, 'priority': 1, 'channels': 40}}, 
   {'22': {'x': 000, 'priority': 1, 'channels': 55}}
 ]

标签: python-3.xlistdictionary

解决方案


你可以试试

from collections import defaultdict

res = defaultdict(list)
for i in data:
    res[list(i.keys())[0]].append(i)
print([min(i, key=lambda x: list(x.values())[0]['priority']) for i in res.values()])

输出

[{'11': {'x': 333, 'priority': 1, 'channels': 40}}, {'22': {'x': 0, 'priority': 1, 'channels': 55}}]

defaultdict聚合具有相同键的所有字典,然后与min函数的列表比较将按最小优先级返回字典。


推荐阅读