从两个具有匹配值的字典列表中创建一个字典

时间:2018-11-26 15:50:56

标签: python list dictionary

我有两个字典列表,dict1dict2

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 :(得分:1)

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

以及之后的groupagg

答案 1 :(得分:0)

您可以先将名称放在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]}

答案 2 :(得分:0)

您也可以在纯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]}

答案 3 :(得分:0)

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