Создайте dict из двух списков dicts с соответствующим значением - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть два списка словарей, dict1 и dict2.

dict1 = [
  {
    'id': 0,
    'name': 'James'
  }, {
    'id': 1,
    'name': 'Bob'
  }
]

dict2 = [
  {
    'id': 0,
    'name': 'James'
  }, {
    'id': 1,
    'name': 'James'
  }, {
    'id': 2,
    'name': 'Bob'
  }
]

И я хочу создать что-то вроде:

result = {'James': [0, 1], 'Bob': [2]}

С именами из dict1 в качестве ключей и в качестве значения список полей "id", имеющих одинаковыеимя.

Какой чистый способ сделать это в Python?

Ответы [ 4 ]

0 голосов
/ 26 ноября 2018

IIUC, вот решение defaultdict:

>>> from collections import defaultdict
>>> 
>>> result = defaultdict(list)
>>> names = {d['name'] for d in dict1}
>>> 
>>> for d in dict2:
...:    name = d['name']
...:    if name in names:
...:        result[name].append(d['id'])
...:        
>>> result
defaultdict(list, {'Bob': [2], 'James': [0, 1]})
0 голосов
/ 26 ноября 2018

Вы можете сначала поместить имена в dict1 в наборе, чтобы при итерации по dict2 можно было проверить, присутствует ли текущее имя в наборе, прежде чем добавлять его в результирующий набор списков:

names = {d['name'] for d in dict1}
result = {}
for d in dict2:
    if d['name'] in names:
        result.setdefault(d['name'], []).append(d['id'])

result становится:

{'James': [0, 1], 'Bob': [2]}
0 голосов
/ 26 ноября 2018

Вы также можете сделать это на чистом Python следующим образом:

dict1 = [
  {
    'id': 0,
    'name': 'James'
  }, {
    'id': 1,
    'name': 'Bob'
  }
]


dict2 = [
  {
    'id': 0,
    'name': 'James'
  }, {
    'id': 1,
    'name': 'James'
  }, {
    'id': 2,
    'name': 'Bob'
  }
]

names = [elem['name'] for elem in dict1]
result = dict((name,[]) for name in names)
for elem in dict2:
    result[elem['name']].append(elem['id'])
print(result)

Вывод:

{'James': [0, 1], 'Bob': [2]}
0 голосов
/ 26 ноября 2018

IIUC, я считаю, что последняя строка должна быть Bob, а не James.Таким образом, используя pandas

import pandas as pd
>>> df1 = pd.DataFrame(dict1)
>>> df2 = pd.DataFrame(dict2)

>>> df2.groupby('name').agg(list).to_dict()['id']
{'Bob': [2], 'James': [0, 1]}

Для фильтрации только names, которые находятся в dict1,

>>> df2 = df2[df2['name'].isin(df1['name'])]

и group и agg после этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...