2016-11-21 15 views
2

共有キーを持つ辞書のリストをキーにマージしようとしています:リストにすべての値が含まれているリストのペアリング。下のコードがそれをしますが、それは非常に醜いです。私は、これを達成するためにディクショナリのリストでreduceを使用できることを漠然として覚えていますが、私は迷っています。ディクショナリのリストを辞書キーにマージする方法:リストのペアリングですか?

1 dictionaries = [{key.split(',')[0]:key.split(',')[1]} for key in open('test.data').read().splitlines()] 
    2 print dictionaries 
    3 new_dict = {} 
    4 for line in open('test.data').read().splitlines():                     
    5  key, value = line.split(',')[0], line.split(',')[1] 
    6  if not key in new_dict: 
    7   new_dict[key] = [] 
    8  new_dict[key].append(value) 
    9 print new_dict 

出力:

[{'abc': ' a'}, {'abc': ' b'}, {'cde': ' c'}, {'cde': ' d'}] 
{'cde': [' c', ' d'], 'abc': [' a', ' b']} 

test.dataは含まれています

abc, a 
abc, b 
cde, c 
cde, d 
+0

コード。 – wwii

+2

@wwii:動作するコードは* fine *です。美しいコードは目を楽しませています –

答えて

5

あなたforループとしてcollections.defaultdictを使用して簡単にすることができます美しい作品

from collections import defaultdict 

new_dict = defaultdict(list) 

for line in open('test.data').readlines(): # `.readlines()` will work same as 
              # `.read().splitlines()` 
    key, value = line.split(', ') # <-- unwrapped and automatically assigned 
    new_dict[key].append(value) 
関連する問題