如何将两个字典合并到同一个元素(key:val)

2024-10-08 19:22:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一套字典: 我在合并词汇表时使用了相同的值key:userId. 我知道,在set中,我只能找到一个或两个具有相同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

Tags: ofinfor字典resultmergeditemone
1条回答
网友
1楼 · 发布于 2024-10-08 19:22:36

基本上,您需要一个分组操作。在这种情况下,最容易使用另一个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'}]
>>>

如果您只需要“合并”的dict,那么分两步完成可能是最简单的。您仍然可以使用dict进行分组,但要先分组到一个列表中,并且只合并具有多个dict的列表:

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

相关问题 更多 >

    热门问题