2

如果我有两个字典:

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

3 回答 3

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

我相信,这是完成任务的最简单、最有效的方法。所有操作都在原地完成而不会生成新对象。在这种情况下,更高级的搜索方法是不可能的,因为您的对象没有键(它是字典......)。线性搜索是我们能做的最好的。

于 2013-07-26T23:11:17.780 回答
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'}]
于 2013-07-26T22:06:23.810 回答
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']

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

于 2013-07-26T22:03:57.347 回答