Python 将元素添加到字典列表中

Python 将元素添加到字典列表中,python,list,dictionary,Python,List,Dictionary,正常情况下,我不会发布这个,但在过去的10个小时里,它一直让我发疯 我有两本字典。但它们要么没有,要么有一个或两个共同点。如果在迭代第二个列表中的元素时,我匹配第一个列表中的键值对,那么我必须将这些元素添加到第一个列表中的特定位置 因此,第一个列表如下所示: list1 = [{'key11':'value11', 'key12':'value12', ...}, {'key11':'value111', 'key121':'value121', ...}] 列表2与上述列表类似: list2

正常情况下,我不会发布这个,但在过去的10个小时里,它一直让我发疯

我有两本字典。但它们要么没有,要么有一个或两个共同点。如果在迭代第二个列表中的元素时,我匹配第一个列表中的键值对,那么我必须将这些元素添加到第一个列表中的特定位置

因此,第一个列表如下所示:

list1 = [{'key11':'value11', 'key12':'value12', ...}, {'key11':'value111', 'key121':'value121', ...}]
列表2与上述列表类似:

list2 = [{'2key11':'value11', 'key12':'value12', '2key13': 'value'...}, {...}]
请注意,
key12
在两个列表中是相同的。所以我想要的最终产品是:

>list1 = list1 (some operation) list2
>list1
>[{'key11':'value11', 'key12':'value12', '2key11':'value11', ...}, {'key11':'value111', 'key121':'value121', ...}]
请注意,在所需的输出中,我已将所有第二个List dictionary元素添加到与list1(第一个dictionary)中的key12对应的dictionary中

到目前为止,我一直在手动操作,结果并不好。 我的代码是:

for i in range(len(list)):
    # Now we need to map the panther data as well.
    for pitem in plist:
        # match the id's to the mapped symbols

        if list[i]['key_id1'] == pitem['key_id1']:
            if list[i]['key_id2'] == 'n/a':
                list[i]['key_id2'] = pitem['key_id2']
            list[i]['somekey1'] = panther_item['somekey1']
            list[i]['somekey2'] = panther_item['somekey2']
            list[i]['somekey3'] = panther_item['somekey3'] # <- WHY IS THIS GIVING ME A KEY ERROR AND NOT THE ONE ABOVE IT? Both didnt exist in the dictionary stored in list.
            list[i]['somekey4'] = panther_item['somekey4']
            list[i]['somekey5'] = panther_item['somekey5']

        elif list[i]['key_id2'] == pitem['key_id2']:
            if list[i]['key_id1'] == 'n/a':
                list[i]['key_id1'] = pitem['key_id1']
            list[i]['somekey1'] = panther_item['somekey1']
            list[i]['somekey2'] = panther_item['somekey2']
            list[i]['somekey3'] = panther_item['somekey3']
            list[i]['somekey4'] = panther_item['somekey4']
            list[i]['somekey5'] = panther_item['somekey5']
范围内i的
(len(list)):
#现在我们也需要绘制黑豹的数据。
对于plist中的pitem:
#将id与映射的符号相匹配
如果列表[i]['key\u id1']==pitem['key\u id1']:
如果列表[i]['key_id2']=='n/a':
列表[i]['key_id2']=pitem['key_id2']
列出[i]['somekey1']=panther_项目['somekey1']
列出[i]['somekey2']=panther_项目['somekey2']

list[i]['somekey3']=panther_item['somekey3'].我想我的问题是对的,你想在两个列表中找到两个对应字典的并集吗?下面的代码应该可以实现这一点。请记住,如果对应键的值不同,y(list2字典)将优先于x

list3 = []
for x,y in zip(list1, list2):
    z = x.copy()
    for key, value in y.iteritems():
        if value != 'n/a':
            z[key] = value
    list3.append(z)

也许我没弄错,你想把列表2中所有字典的值添加到列表1中第一个有“key12”的字典中?下面的代码应该可以

first_dict = next(d for d in list1 if 'key12' in d)
for d in list2:
    first_dict.update(d)
如果要将它们添加到列表1中的第一个字典中,该字典具有与列表2中dict相同位置的公用键,则:

first_dict = next(a for a, b in zip(list1, list2) if set(a.keys()) & set(b.keys()))
for d in list2:
    first_dict.update(d)

匹配任何键/值对或仅匹配键1?是的。我知道这一点,但是如果列表1中缺少什么呢?请记住,我最多可以匹配2个键。这意味着,如果我匹配一个键,那么第二个键要么丢失,要么与列表1相同。所以,如果它不见了,最好把它填满。我不知道你说的“什么东西不见了”是什么意思。你的意思是1)一个键丢失,2)一个值,还是3)一整本字典?在案例1中,如果正在比较的两个字典中有一个缺少键,则此代码就足够了。对于情况2,字典2中的键的值将优先。对于案例3,这个程序将迭代两个列表中较短的一个,并对它们进行比较。这将用于生物信息学。因此,每个节点都有一个包含键值对的字典。这些键都是相同的,因为它们是列名。值就是行。所以设想一个场景,其中原始矩阵中缺少一行值(设置为“n/a”)。它将被第二个列表填满。如果第一个列表存储了该值,而第二个列表与第二个键匹配,但与第一个键不匹配,该怎么办。它将用“n/a”覆盖第一个键,从而丢失信息。这是
update
的唯一问题。感谢您的回答,问题似乎已部分解决。但我收到一个钥匙错误,说有一把钥匙丢了
list3
应该在每个节点中包含所有列名。并且每一行都有一个值或
'n/a'
keys=list3[0].keys()
我这样做是为了在您的代码部分和一部分丢失后获取密钥,我无法理解为什么@Sahil M缺少的密钥必须在列表1中不存在,并且在列表2中具有“n/a”。