如果我有两个词典:
[{u'id': 217110,
u'label': u'Business A',
u'score': 0},
{u'id': 217111,
u'label': u'Business B',
u'score': 0},
{u'id': 217112,
u'label': u'Business Yada Yada',
u'score': 0'}]
和
[{u'City': u'Damariscotta',
u'EntityType': u'Maine Public',
u'EntityTypeCode': u'1',
u'Status1': u'Open',
u'ID': u'0188',
u'Name1': u'A Company 000',
u'UpdateTimeUnix': 1363756455},
{u'City': u'Santa Barbra',
u'EntityType': u'California Public',
u'EntityTypeCode': u'1',
u'Status1': u'Delayed',
u'ID': u'1001',
u'Name1': u'Business A',
u'UpdateTimeUnix': 1363758764},
{u'City': u'Boise',
u'EntityType': u'Idaho Public',
u'EntityTypeCode': u'1',
u'Status1': u'Closed',
u'ID': u'1012',
u'Name1': u'Business Yada Yada',
u'UpdateTimeUnix': 1363759375},
{u'City': u'Elkhart',
u'EntityType': u'Indiana Public',
u'EntityTypeCode': u'1',
u'Status1': u'Open',
u'ID': u'1016',
u'Name1': u'Business B',
u'UpdateTimeUnix': 1363826341}]
简而言之,获得此功能的有效方法是什么?:
[{u'id': 217110,
u'label': u'Business A',
u'score': 0,
u'Status1': u'Delayed'},
{u'id': 217111,
u'label': u'Business B',
u'score': 0,
u'Status1': u'Open'},
{u'id': 217112,
u'label': u'Business Yada Yada',
u'score': 0',
u'Status1': u'Open'}]
答案 0 :(得分:1)
使用operator.itemgetter:
from operator import itemgetter
key1 = itemgetter("Name1")
key2 = itemgetter("label")
key3 = itemgetter("Status1")
for record in b: # this is the longer list of dicts
k = key1(record)
for record2 in a: #this is the shorter one
if key2(record2) == k:
record2['Status1'] = key3(record)
print a
输出:
[{u'score': 0, 'Status1': u'Delayed', u'id': 217110, u'label': u'Business A'}, {u'score': 0, 'Status1': u'Open', u'id': 217111, u'label': u'Business B'}, {u'score': 0, 'Status1': u'Closed', u'id': 217112, u'label': u'Business Yada Yada'}]
答案 1 :(得分:1)
首先,这听起来像家庭作业问题。我们都鼓励求职者发布他们所写的内容,以便我们对其进行评论。但你还没有告诉我们你做了什么。
其次,不建议存储数据的方式。如果键来自一个小的固定集,那么最好在字典中使用namedtuple,并为每个对象使用唯一键。特别是对于第二个列表,您必须迭代才能找到一个名称。在这种情况下,名称值将是关键。请参阅:http://docs.python.org/2/library/collections.html
第三,请在你的问题中说清楚。我们会花时间帮助您,所以请花点时间帮助我们。
第四,做你想做的事:
for user in list1:
for record in list2:
if not record['Name1'] == user['label']:
continue
user['Status1'] = record['Status1']
我认为,这是完成任务的最简单,最有效的方法。所有操作都在适当的位置完成而不生成新对象。在这种情况下,Fancier搜索方法是不可能的,因为你的对象没有密钥(它是一个字典......)。线性搜索是我们能做的最好的事情。
答案 2 :(得分:0)
实际上并不是非常有趣的谜题,假设这两个列表分别由u'label'
和u'Name1'
加入。
现在回答你的问题我会说有效的方法是通过u'Name1'
name_index = {item[u'Name1']: i for i, item in enumerate(list2)}
然后您可以使用
轻松更新第一个列表中的项目for item in list1:
item[u'Status1'] = list2[name_index[item[u'label']]][u'Status1']
注意:这里的效率标准是从第二个列表中获取状态的速度