DICT列表为具有相同值的项添加keyvalue以用于另一个keyvalue

2024-09-30 18:16:13 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一个dict列表

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

也就是说,为相同的Main ID添加包含Sub IDs的列表-这里item0和item1具有相同的Main ID

什么是pythonic的方法来实现这一点-有没有一种方法可以理解列表


Tags: 方法idids列表main格式pythonicdict
2条回答

第一步是获取所有不同的'Main ID'set。我们还可以立即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循环移到已有循环的末尾,将其包装回一个列表中,从而使其成为完整的列表理解:

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

并且达到了预期的效果

[{'Main ID': 0, 'Sub IDs': [0, 3]}, {'Main ID': 2, 'Sub IDs': [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]}]

相关问题 更多 >