我有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']
答案 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中的值作为默认值。