字典:如果值相同,如何比较值和合并?

时间:2013-07-26 21:27:01

标签: python

如果我有两个词典:

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

3 个答案:

答案 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']

注意:这里的效率标准是从第二个列表中获取状态的速度