我有两个字典列表,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中有什么干净的方法?
答案 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'])]
以及之后的group
和agg
答案 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]})