如何使用另一个列表中的dict值在一个列表中填充dict的值?

时间:2014-12-09 22:12:19

标签: python list for-loop dictionary

我有2个列表,每个列表都包含dicts,我需要在第二个列表中填入值,其中第一个值基于'id'键。现在我正在使用下面的代码,但感觉太复杂(迭代太多)。有更多的pythonic方式吗?

a = [{'id':1, 'tag':'11'},{'id':2, 'tag':'12'},{'id':3, 'tag':'13'},{'id':4, 'tag':'14'}]
b = [{'id':1, 'tag':None},{'id':2, 'tag':None},{'id':3, 'tag':None},{'id':4, 'tag':None}, {'id':5, 'tag':None}]

for item1 in a:
    for item2 in b:
        if item1['id'] == item2['id']:
            item2['tag'] = item1['tag']

3 个答案:

答案 0 :(得分:1)

你不能做像

这样的事情
a = [{'id':1, 'tag':'11'},{'id':2, 'tag':'12'},{'id':3, 'tag':'13'},{'id':4, 'tag':'14'}]
b = [{'id':1, 'tag':None},{'id':2, 'tag':None},{'id':3, 'tag':None},{'id':4, 'tag':None}, {'id':5, 'tag':None}]


b[0:len(a)] = a

答案 1 :(得分:0)

您的代码似乎不正确;你有两个dicts列表,只有当两个词典在列表位置的id 中匹配时才复制tag的值。如果列表完全匹配,则不需要检查ID,如果需要检查ID,则不应该关心字典的显示位置。所以我们假设ID很重要;按ID匹配的标准方法是将它们全部索引到另一个字典中。所以我会这样做:

index = [ (item1["id"], item1) for item1 in a ]
for item2 in b:
    if item2['id'] in index:
        item2['tag'] = index[ item2['id'] ]['tag']

这很清楚,但你可以通过立即获取和保存值来避免双重查找, 如果可能的话:

index = [ (item1["id"], item1) for item1 in a ]
for item2 in b:
    try:
        id2 = item2["id"]
        newval = index[id2]["tag"]
        item2["tag"] = newval
    except ValueError:
        pass

答案 2 :(得分:0)

我建议建立一个新的字典,将ID值与标签值配对。然后,您可以对a进行一次传递,并更新要更新的值。这是我能写的最清晰的代码:

bvals = {d['id']:d['tag'] for d in b}

for d in a:
    id_val = d['id']
    if id_val in bvals:
        d['tag'] = bvals[id_val]

它有点简洁,但你可以用更少的代码这样做:

for d in a:
    d['tag'] = bvals.get(d['id'], d['tag'])

这取决于字典上的.get()方法,如果存在,则返回由键索引的值,如果字典中不存在键,则返回默认值。此代码使用已存储在密钥tag下的dict中的值作为默认值。