8

私は辞書のリストを持っています:

a =[{'id': 1,'desc': 'smth'},
    {'id': 2,'desc': 'smthelse'},
    {'id': 1,'desc': 'smthelse2'},
    {'id': 1,'desc': 'smthelse3'}]

idリストを調べて、同じ値を持つ dict を見つけて (例: id=1)、新しい dict を作成したいと思います。

b = [{'id':1, 'desc' : [smth, smthelse2,smthelse3]}, 
     {'id': 2, 'desc': 'smthelse'}]
4

3 に答える 3

11

あなたが試すことができます:

import operator, itertools

key = operator.itemgetter('id')

b = [{'id': x, 'desc': [d['desc'] for d in y]} 
     for x, y in itertools.groupby(sorted(a, key=key), key=key)]
于 2013-02-26T14:04:52.297 に答える
3

要素が 1 つしか含まれていない場合でも、"desc" 値をどこでもリストとして保持することをお勧めします。こうすればできる

for d in b:
    print d['id']
    for desc in d['desc']:
        print desc

これは文字列に対しても機能し、個々の文字を返すだけで、これはあなたが望むものではありません.

そして今、リストの辞書のリストを提供するソリューション:

a =[{'id': 1,'desc': 'smth'},{'id': 2,'desc': 'smthelse'},{'id': 1,'desc': 'smthelse2'},{'id': 1,'desc': 'smthelse3'}]

c = {}
for d in a:
    c.setdefault(d['id'], []).append(d['desc'])
b = [{'id': k, 'desc': v} for k,v in c.iteritems()]

b今でしょ:

[{'desc': ['smth', 'smthelse2', 'smthelse3'], 'id': 1},
 {'desc': ['smthelse'], 'id': 2}]
于 2013-02-26T14:01:30.860 に答える
0
from collections import defaultdict

d = defaultdict(list)
for x in a:
    d[x['id']].append(x['desc']) # group description by id
b = [dict(id=id, desc=desc if len(desc) > 1 else desc[0])
     for id, desc in d.items()]

順序を維持するには:

b = []
for id in (x['id'] for x in a):
    desc = d[id]
    if desc:
       b.append(dict(id=id, desc=desc if len(desc) > 1 else desc[0]))
       del d[id]
于 2013-02-26T14:04:54.120 に答える