Объединить два списка словарей по паре ключ / значение в Python 2.7 - PullRequest
0 голосов
/ 08 мая 2018

У меня есть два списка словарей. Как мне объединить их, основываясь на ключе / значении, которое является общим для обоих?

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'. Я пробовал этот код из этой статьи

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

Я хотел бы иметь список, который выглядит следующим образом, где прогнозы добавляются в data_list, совпадающий с key (так, где '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 голосов
/ 09 мая 2018

Предполагая, что у вас есть списки 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]
0 голосов
/ 09 мая 2018

Я посмотрел на код, у двух диктов "data_list" и "ret_data_list" есть ключ в их диктовке, но значения разные. «Ret_data_list» содержит «ключ», но имеет список со значением (u'key ': [u'1']) . Вам нужно изменить тип этого значения в "ret_data_list" и сделать его (u'key ':' 1 ') .

После того, как вы сделаете значения для «ключа» одинаковыми в обоих разделах, фрагмент кода будет работать правильно.

Вы можете попробовать этот код, чтобы изменить значение ключа в ret_data_list: -

for data in ret_data_list:
   data['key'] = (''.join(data['key']).encode("ascii","ignore"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...