2017-05-22 4 views
1

私は辞書のセットを持っています: そして私はkey:userIdと同じ値を持つ雑誌をマージします。 私は知っている、セットで私は同じuserIdで1つまたは2つの辞書を見つけることができます。 マージされた辞書のみが私のために紹介されています。 私のコードは機能しますが、私は知りたいのですが、他のよりエレガントな方法かもしれません。 私の例(下記)では、辞書には辞書がほとんどなく、各辞書にはいくつかの位置があります。 辞書の非常に大きなセットでそれを使用したいと思っています。マージ後、辞書に〜30個のelemntが必要です。どのようにこの同じ要素(キー:val)と2つの辞書をマージする

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 

答えて

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

あなただけの「合併」dictsをしたい場合は、それは二つのステップでそれを行うには、おそらく最も簡単です。 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'}] 
>>> 
関連する問題