【问题标题】:how merge two dictionary with this same element (key:val)如何合并两个具有相同元素的字典(键:val)
【发布时间】:2017-05-22 21:56:58
【问题描述】:

我有一套字典: 我希望将具有相同 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

【问题讨论】:

    标签: python dictionary merge key-value


    【解决方案1】:

    从根本上说,您需要一个 分组 操作。在这种情况下,最简单的方法是使用 另一个 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 的那些:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多