【问题标题】:Python Iterating Through List and Appending Values to KeyPython遍历列表并将值附加到键
【发布时间】:2021-09-27 07:02:31
【问题描述】:

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

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

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

【问题讨论】:

  • 也许有更简单的方法可以使用 list_two id 替换 list_one 中的 id?
  • How to debug small programs。如果您正在使用 IDE现在是学习其调试功能或内置 Python debugger 的好时机。在程序中的关键点打印 stuff 可以帮助您跟踪正在发生或未发生的事情。 What is a debugger and how can it help me diagnose problems?
  • 我在这里使用了调试,但我不明白是什么导致了这些问题。我不习惯 Python 和使用列表。
  • 你的循环试图做什么?
  • 它遍历两个列表,因此我可以使用密钥进行验证。最后一个循环设置了一个元组,我可以使用它来设置id 等于list_two 中的索引。这允许我附加多个 id 值。如果我不枚举它只会附加一个值。

标签: python list loops dictionary append


【解决方案1】:

当迭代遇到一个 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']

【讨论】:

    【解决方案2】:

    您可以通过字典理解来做到这一点:

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

    【讨论】:

    • 如果它解决了您的问题,请接受答案。
    • 两个答案都是正确的。既然你先回复了,我就给你。
    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多