带有下面的字典列表
[{'Main ID': 0, 'Sub IDs': [0]}, {'Main ID': 0, 'Sub IDs': [3]}, {'Main ID': 2, 'Sub IDs': [3]}]
我需要将其压缩为以下格式
[{'Main ID': 0, 'Sub IDs': [0,3]}, {'Main ID': 2, 'Sub IDs': [3]}]
也就是说,为相同的Sub IDs
添加包含Main ID
的列表-这里item0和item1的值与Main ID
相同。
实现此目标的pythonic方法是什么-有列表理解的方法吗?
答案 0 :(得分:3)
使用字典为每个主要ID存储一组子ID并迭代列表。我假设子ID是唯一的?然后在字典的末尾创建一个新列表。
lst = [{'Main ID': 0, 'Sub IDs': [0]}, {'Main ID': 0, 'Sub IDs': [3]}, {'Main ID': 2, 'Sub IDs': [3]}]
d = {}
for dd in lst:
d.setdefault(dd['Main ID'], set()).update(dd['Sub IDs'])
newlst = [{'Main ID':k, 'Sub IDs':list(v)} for k,v in d.items()]
print(newlst)
输出:
>>>[{'Main ID': 0, 'Sub IDs': [0, 3]}, {'Main ID': 2, 'Sub IDs': [3]}]
答案 1 :(得分:2)
第一步是获取所有不同set
的{{1}}。由于我们现在方便地将它们分组在一起,因此我们也可以立即'Main ID'
列出每个人的sum
列表。
'Sub IDs'
l = [{'Main ID': 0, 'Sub IDs': [0]}, {'Main ID': 0, 'Sub IDs': [3]}, {'Main ID': 2, 'Sub IDs': [3]}]
for key in set(key['Main ID'] for key in l):
print (key, end=': ')
print (sum([value['Sub IDs'] for value in l if value['Main ID'] == key],[]))
效果很好,实际上您已经在这里完成了!此结果可以用作列表的简单列表。但是您想重建字典。原始键名丢失了,因此我们再次插入它们,使其再次成为字典。
0: [0, 3]
2: [3]
for key in set(key['Main ID'] for key in l):
print ({'Main ID':key, 'Sub IDs':sum([value['Sub IDs'] for value in l if value['Main ID'] == key],[])})
由于在一个集合上有一个简单的{'Main ID': 0, 'Sub IDs': [0, 3]}
{'Main ID': 2, 'Sub IDs': [3]}
循环,我们可以通过将for
包装回列表中,通过移动for
循环使其成为完整列表理解到我们已经拥有的末尾:
set
这是单行的
print ([{'Main ID':key, 'Sub IDs':sum([value['Sub IDs'] for value in l if value['Main ID'] == key],[])} for key in set(key['Main ID'] for key in l)])
并获得理想的结果
print (
[
{'Main ID':key,
'Sub IDs':sum(
[
value['Sub IDs'] for value in l if value['Main ID'] == key
], []
)
} for key in
set(
key['Main ID'] for key in l
)
] )