字典列表-为另一个键值具有相同值的项目添加键值

时间:2020-02-09 07:10:14

标签: python

带有下面的字典列表

[{'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方法是什么-有列表理解的方法吗?

2 个答案:

答案 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
            )
    ] )