我有两个词典列表。如何根据两者中常见的键/值来连接它们?
DATA_LIST:
[{'app': u'568',
'browser_version': u'0',
'cost': u'9.4547e-08',
'device': u'iPad',
'device_brand': u'Apple',
'device_family': u'iPad',
'device_os': u'iOS',
'device_os_version': u'11.3',
'end_time': u'2018-05-03',
'key': '1',
'latency': 0.435227,
'megacycles': 370.0,
'ua_parse': u'40.10.7'},
{'app': u'571',
'browser_version': u'66.0.3359',
'cost': u'1.3075e-08',
'device': u'0',
'device_brand': u'0',
'device_family': u'Other',
'device_os': u'Mac OS X',
'device_os_version': u'10.12.6',
'end_time': u'2018-05-07',
'key': '2',
'latency': 0.191712,
'megacycles': 146.0,
'ua_parse': u'5.0'}]
和ret_data_list:
[{u'key': [u'1'], u'predictions': [0.044329315423965454]},
{u'key': [u'2'], u'predictions': [-0.17194432020187378]}]
我想在'key'
上连接。我已尝试过此article
lst = sorted(itertools.chain(data_list,ret_data_list), key=lambda x:x['key'])
list_c = []
for k,v in itertools.groupby(lst, key=lambda x:x['key']):
d = {}
for dct in v:
d.update(dct)
list_c.append(d)
print list_c
其中列出了这样的词典列表:
[{u'predictions': [0.044329315423965454], u'key': [u'1']},
{u'predictions': [-0.17194432020187378], u'key': [u'2']},
{'megacycles': 370.0,
'latency': 0.435227,
'app': u'568',
'device_os_version': u'11.3',
'ua_parse': u'40.10.7',
'device_family': u'iPad',
'browser_version': u'0',
'cost': u'9.4547e-08',
'device_brand': u'Apple',
'end_time': u'2018-05-03',
'key': '1',
'device': u'iPad',
'device_os': u'iOS'},
{'megacycles': 146.0,
'latency': 0.191712,
'app': u'571',
'device_os_version': u'10.12.6',
'ua_parse': u'5.0',
'device_family': u'Other',
'browser_version': u'66.0.3359',
'cost': u'1.3075e-08',
'device_brand': u'0',
'end_time': u'2018-05-07',
'key': '2',
'device': u'0',
'device_os': u'Mac OS X'}]
我想要的是一个类似于此的列表,其中预测被附加到key
匹配的data_list(所以'key':'1' == u'key': [u'1']
)
[{'app': u'568',
'browser_version': u'0',
'cost': u'9.4547e-08',
'device': u'iPad',
'device_brand': u'Apple',
'device_family': u'iPad',
'device_os': u'iOS',
'device_os_version': u'11.3',
'end_time': u'2018-05-03',
'key': '1',
'latency': 0.435227,
'megacycles': 370.0,
'ua_parse': u'40.10.7',
'predictions': 0.044329315423965454},
{'app': u'571',
'browser_version': u'66.0.3359',
'cost': u'1.3075e-08',
'device': u'0',
'device_brand': u'0',
'device_family': u'Other',
'device_os': u'Mac OS X',
'device_os_version': u'10.12.6',
'end_time': u'2018-05-07',
'key': '2',
'latency': 0.191712,
'megacycles': 146.0,
'ua_parse': u'5.0',
'predictions': -0.17194432020187378}]
答案 0 :(得分:1)
我查看了代码,两个词典“data_list”和“ret_data_list”在他们的词典中有'键',但值不同。 “ret_data_list”包含“key”,但有一个列表,因为它的值为(u'key':[u'1'])。您需要在“ret_data_list”中更改该值的类型,并将其设为(u'key':'1')。
在两个dicts中使“key”的值相同后,代码片段就能正常运行。
您可以尝试使用此代码更改“ret_data_list”中的“键”值: -
for data in ret_data_list:
data['key'] = (''.join(data['key']).encode("ascii","ignore"))
答案 1 :(得分:1)
假设您有列表lst1
和lst2
,则可以在嵌套的for
循环中进行迭代。这是低效的,但它具有操纵字典列表的性质。
唯一的另一个复杂因素是您需要在lst2
词典中提取列表值的唯一元素。
for item1 in lst1:
for item2 in lst2:
if item1['key'] == item2[u'key'][0]:
item1['predictions'] = item2[u'predictions'][0]