如何将两个字典与同一个元素合并(key:val)
how merge two dictionary with this same element (key:val)
我有一套字典:
我想将字典与 key:userId 的相同值合并。
我知道,在集合中我只能找到一个或两个具有相同 userId 的词典。
只有合并的词典对我来说很重要。
我的代码有效,但我只想知道,也许还有其他更优雅的方法。
在我的示例(下)中,列表中只有很少的词典,每个词典中的位置也很少。
我想在非常大的字典集上使用它,合并后我希望字典中有 ~ 30 个元素。
set_of_dict=[
{'prop1':'firstName','prop2':'lastname','userId':'100','prop3':'somefield'},
{'prop1':'value1','prop2':'value2','userId':'200','prop3':'value3'},
{'prop4':'email','prop5':'www','userId':'100','prop6':'blah'},
{'prop4':'abc','prop5':'qaq','userId':'200','prop6':'xx'},
{'prop1':'value1','prop2':'value2','userId':'400','prop3':'value3'},
{'prop4':'value4','prop5':'ssss','userId':'484','prop6':'val66'}]
"""
#output:
result=[
{'prop1':'firstName','prop2':'lastname','userId':'100','prop3':'somefield','prop4':'email','prop5':'www','prop6':'blah'}},
{'prop1':'value1','prop2':'value2','userId':'200','prop3':'value3','prop4':'abc','prop5':'qaq','userId':'200','prop6':'xx'}
]
"""
temp={}
result=[]
list_of_merged_id=[]
lastStep=[]
for j in set_of_dict:
if not any(b['userId'] == j['userId'] for b in result):
result.append(j)
else:
for item in result:
if item.has_key('userId') and item['userId']==j.get('userId'):
item.update(j)
list_of_merged_id.append(j.get('userId'))
for one in result:
if one['userId'] in list_of_merged_id:
lastStep.append(one)
else:
print str(one['userId']) + ": no merged - some data has been lost"
for a in lastStep:
print a
从根本上说,您需要一个 分组 操作。在这种情况下,最简单的方法是使用 another dict 进行分组:
>>> from collections import defaultdict
>>> grouped = defaultdict(dict)
>>> set_of_dict=[
... {'prop1':'firstName','prop2':'lastname','userId':'100','prop3':'somefield'},
... {'prop1':'value1','prop2':'value2','userId':'200','prop3':'value3'},
... {'prop4':'email','prop5':'www','userId':'100','prop6':'blah'},
... {'prop4':'abc','prop5':'qaq','userId':'200','prop6':'xx'},
... {'prop1':'value1','prop2':'value2','userId':'400','prop3':'value3'},
... {'prop4':'value4','prop5':'ssss','userId':'484','prop6':'val66'}]
>>> for d in set_of_dict:
... grouped[d['userId']].update(d)
...
>>> from pprint import pprint
>>> pprint(list(grouped.values()))
[{'prop1': 'value1',
'prop2': 'value2',
'prop3': 'value3',
'prop4': 'abc',
'prop5': 'qaq',
'prop6': 'xx',
'userId': '200'},
{'prop1': 'firstName',
'prop2': 'lastname',
'prop3': 'somefield',
'prop4': 'email',
'prop5': 'www',
'prop6': 'blah',
'userId': '100'},
{'prop1': 'value1', 'prop2': 'value2', 'prop3': 'value3', 'userId': '400'},
{'prop4': 'value4', 'prop5': 'ssss', 'prop6': 'val66', 'userId': '484'}]
>>>
如果您只想要 "merged" 指令,那么分两步完成可能是最简单的方法。您仍然可以使用字典进行分组,但首先将其分组到一个列表中,并且只合并那些具有多个字典的列表:
>>> grouped = defaultdict(list)
>>> for d in set_of_dict:
... grouped[d['userId']].append(d)
...
>>> result = []
>>> for v in grouped.values():
... if len(v) > 1:
... temp = {}
... for d in v:
... temp.update(d)
... result.append(temp)
...
>>> pprint(result)
[{'prop1': 'value1',
'prop2': 'value2',
'prop3': 'value3',
'prop4': 'abc',
'prop5': 'qaq',
'prop6': 'xx',
'userId': '200'},
{'prop1': 'firstName',
'prop2': 'lastname',
'prop3': 'somefield',
'prop4': 'email',
'prop5': 'www',
'prop6': 'blah',
'userId': '100'}]
>>>
我有一套字典: 我想将字典与 key:userId 的相同值合并。 我知道,在集合中我只能找到一个或两个具有相同 userId 的词典。 只有合并的词典对我来说很重要。 我的代码有效,但我只想知道,也许还有其他更优雅的方法。 在我的示例(下)中,列表中只有很少的词典,每个词典中的位置也很少。 我想在非常大的字典集上使用它,合并后我希望字典中有 ~ 30 个元素。
set_of_dict=[
{'prop1':'firstName','prop2':'lastname','userId':'100','prop3':'somefield'},
{'prop1':'value1','prop2':'value2','userId':'200','prop3':'value3'},
{'prop4':'email','prop5':'www','userId':'100','prop6':'blah'},
{'prop4':'abc','prop5':'qaq','userId':'200','prop6':'xx'},
{'prop1':'value1','prop2':'value2','userId':'400','prop3':'value3'},
{'prop4':'value4','prop5':'ssss','userId':'484','prop6':'val66'}]
"""
#output:
result=[
{'prop1':'firstName','prop2':'lastname','userId':'100','prop3':'somefield','prop4':'email','prop5':'www','prop6':'blah'}},
{'prop1':'value1','prop2':'value2','userId':'200','prop3':'value3','prop4':'abc','prop5':'qaq','userId':'200','prop6':'xx'}
]
"""
temp={}
result=[]
list_of_merged_id=[]
lastStep=[]
for j in set_of_dict:
if not any(b['userId'] == j['userId'] for b in result):
result.append(j)
else:
for item in result:
if item.has_key('userId') and item['userId']==j.get('userId'):
item.update(j)
list_of_merged_id.append(j.get('userId'))
for one in result:
if one['userId'] in list_of_merged_id:
lastStep.append(one)
else:
print str(one['userId']) + ": no merged - some data has been lost"
for a in lastStep:
print a
从根本上说,您需要一个 分组 操作。在这种情况下,最简单的方法是使用 another dict 进行分组:
>>> from collections import defaultdict
>>> grouped = defaultdict(dict)
>>> set_of_dict=[
... {'prop1':'firstName','prop2':'lastname','userId':'100','prop3':'somefield'},
... {'prop1':'value1','prop2':'value2','userId':'200','prop3':'value3'},
... {'prop4':'email','prop5':'www','userId':'100','prop6':'blah'},
... {'prop4':'abc','prop5':'qaq','userId':'200','prop6':'xx'},
... {'prop1':'value1','prop2':'value2','userId':'400','prop3':'value3'},
... {'prop4':'value4','prop5':'ssss','userId':'484','prop6':'val66'}]
>>> for d in set_of_dict:
... grouped[d['userId']].update(d)
...
>>> from pprint import pprint
>>> pprint(list(grouped.values()))
[{'prop1': 'value1',
'prop2': 'value2',
'prop3': 'value3',
'prop4': 'abc',
'prop5': 'qaq',
'prop6': 'xx',
'userId': '200'},
{'prop1': 'firstName',
'prop2': 'lastname',
'prop3': 'somefield',
'prop4': 'email',
'prop5': 'www',
'prop6': 'blah',
'userId': '100'},
{'prop1': 'value1', 'prop2': 'value2', 'prop3': 'value3', 'userId': '400'},
{'prop4': 'value4', 'prop5': 'ssss', 'prop6': 'val66', 'userId': '484'}]
>>>
如果您只想要 "merged" 指令,那么分两步完成可能是最简单的方法。您仍然可以使用字典进行分组,但首先将其分组到一个列表中,并且只合并那些具有多个字典的列表:
>>> grouped = defaultdict(list)
>>> for d in set_of_dict:
... grouped[d['userId']].append(d)
...
>>> result = []
>>> for v in grouped.values():
... if len(v) > 1:
... temp = {}
... for d in v:
... temp.update(d)
... result.append(temp)
...
>>> pprint(result)
[{'prop1': 'value1',
'prop2': 'value2',
'prop3': 'value3',
'prop4': 'abc',
'prop5': 'qaq',
'prop6': 'xx',
'userId': '200'},
{'prop1': 'firstName',
'prop2': 'lastname',
'prop3': 'somefield',
'prop4': 'email',
'prop5': 'www',
'prop6': 'blah',
'userId': '100'}]
>>>