在Python 2.7中连接键/值对上的两个字典列表

时间:2018-05-08 03:07:35

标签: python python-2.7 dictionary

我有两个词典列表。如何根据两者中常见的键/值来连接它们?

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

2 个答案:

答案 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)

假设您有列表lst1lst2,则可以在嵌套的for循环中进行迭代。这是低效的,但它具有操纵字典列表的性质。

唯一的另一个复杂因素是您需要在lst2词典中提取列表值的唯一元素。

for item1 in lst1:
    for item2 in lst2:
        if item1['key'] == item2[u'key'][0]:
            item1['predictions'] = item2[u'predictions'][0]