Python 遍历列表并将值附加到键

时间:2021-07-19 15:50:42

标签: python list loops dictionary append

我得到了这个循环,它遍历 list_one 包含嵌套在“groups”中的键“id”。 另一个 list_two 也包含键“id”但不是嵌套的。我做的第一件事是验证它们是否彼此相等。如果不是,则继续循环。

我遇到的问题是,对于 new_list 追加后,CA id 多次相同。它们也被附加到另一个数组中并多次打印。

list_one = [
    {   
        'name': 'CA',
        'group': 
            {
                'id': ['a12345', 'aa12']
        }
    },
    {   
        'name': 'TE',
        'group': 
            {
                'id': ['b12345']
        }
    },
    {   
        'name': 'DA',
        'group': 
            {
                'id': ['cab124']
        }
    }
]

list_two = [
    {   
        'name': 'CA',
        'id': ['ac123', 'bb12345']
    },
    {   
        'name': 'TE',
        'id': 'abc123'
    },
    {   
        'name': 'DA',
        'id': 'e123'
    }
]

for list_A in list_one:  # list_one is a list
    for list_B in list_two:  # list_two is a list
        if list_A['name'] == list_B['name']:
            if list_B['id'] not in list_A['group']['id']:  #list_A and #list_B are a dictionary
                for index, ids in enumerate(list_A['group']['id']):  # using tuple to assign the values using the index
                    list_A['group']['id'][index] = list_B['id']
    new_list.append(list_A)

我得到的输出:

[
    {
        'name': 'CA',
        'group': {
            'id': 
                [
                    ['ac123', 'bb12345'],
                    ['ac123', 'bb12345']
                ]
        }
    },
    
    {
        'name': 'TE',
        'group': {
            'id': [
                ['abc123']
            ]
        }
    },
    
    {
        'name': 'DA',
        'group': {
            'id': [
                ['e123']
            ]
        }
    }
]

预期输出:

[
    {
        'name': 'CA',
        'group': {
            'id': ['ac123', 'bb12345']
        }
    },

    {
        'name': 'TE',
        'group': {
            'id': ['abc123']
        }
    },
    
    {
        'name': 'DA',
        'group': {
            'id': ['e123']
        }
    }
]

2 个答案:

答案 0 :(得分:0)

您可以使用字典理解来做到这一点:

result = list()
for d in list_one:
    #only keep the dictionary from list_two where the name matches
    other = [o for o in list_two if o["name"]==d["name"]][0]
    result.append({"name": d["name"], "group": {"id": other["id"]}})

>>> result
[{'name': 'CA', 'group': {'id': ['ac123', 'bb12345']}},
 {'name': 'TE', 'group': {'id': 'abc123'}},
 {'name': 'DA', 'group': {'id': 'e123'}}]

答案 1 :(得分:0)

当迭代遇到一个list_A和list_B时,每个都带有'name':'CA'list_B['id'] 是一个包含两个项目的列表。

  • list_B['id'] 是一个包含两个项目的列表

    list_two[0]['id'] --> ['ac123', 'bb12345']
    
  • listA['group']['id'] 是一个包含两个项目的列表

    list_one[0]['group']['id'] --> ['a12345', 'aa12']
    

这部分代码迭代两次并将 ['ac123', 'bb12345'] 分配给 listA['group']['id'] 的每一项

                for index, ids in enumerate(list_A['group']['id']):  # using tuple to assign the values using the index
                    list_A['group']['id'][index] = list_B['id']

就像这样做

>>> a = [1,2]
>>> b = ['a','b']
>>> for i,item in enumerate(a):
...     print(i,item)
...     a[i] = b
...
0 1
1 2
>>> a
[['a', 'b'], ['a', 'b']]

进行此更改:

            if list_B['id'] not in list_A['group']['id']:  #list_A and #list_B are a dictionary
                list_A['group']['id'] = list_B['id']