2017-06-09 8 views
0
[{'id': 6, 'name': 'Jorge'}, {'id': 6, 'name': 'Matthews'}, {'id': 6, 'name': 'Matthews'}, {'id': 7, 'name': 'Christine'}, {'id': 7, 'name': 'Smith'}, {'id': 7, 'name': 'Chris'}] 

と私は、リストのコレクションはあなたがグループにすべてのiditertools.groupbyを使用して、ちょうどグループ内の各要素に対してnameを抽出することができ、この同じIDを持つdictからリストを収集する方法は?

[{'id': 6, 'name': ['Jorge','Matthews','Matthews']}, {'id': 7, 'name': ['Christine','Smith','Chris']}] 

答えて

2
L = [{'id': 6, 'name': 'Jorge'}, {'id': 6, 'name': 'Matthews'}, {'id': 6, 'name': 'Matthews'}, {'id': 7, 'name': 'Christine'}, {'id': 7, 'name': 'Smith'}, {'id': 7, 'name': 'Chris'}] 


temp = {} 
for d in L: 
    if d['id'] not in temp: 
     temp[d['id']] = [] 
    temp[d['id']].append(d['name']) 

answer = [] 
for k in sorted(temp): 
    answer.append({'id':k, 'name':temp[k]}) 
+2

だけ '.setdefault'あるいは' defaultdict'代わり 'Dもし[ 'ID']ではないTEMPでの使用:' ' –

0

のように同じIDを持つ作りたいです。

In [1]: 
import itertools as it 
import operator as op 

L = [{'id': 6, 'name': 'Jorge'}, ...] 

_id = op.itemgetter('id') 
[{'id':k, 'name':[e['name'] for e in g]} for k, g in it.groupby(sorted(L, key=_id), key=_id)] 

Out[1]: 
[{'id': 6, 'name': ['Jorge', 'Matthews', 'Matthews']}, 
{'id': 7, 'name': ['Christine', 'Smith', 'Chris']}] 
+0

groupby'はないであろうリストが辞書キーで順序付けされていない限り、ここで一貫して動作します。 –

+0

True、sortingを追加しました。データがソートされているとは仮定できませんが、OPの例がソートされています。それは、使用するには高価すぎるかもしれないし、そうでないかもしれない。 – AChampion

関連する問題