列表字典转换与每个键多个值?

我有一个Python列表,其中包含键/值对:

l=[ [1, 'A'], [1, 'B'], [2, 'C'] ] 

我想将列表转换成一个字典,其中每个键的多个值将被聚合成一个元组:

 { 1:('A', 'B'), 2:('C',) } 

迭代解决scheme是微不足道的:

 l=[ [1, 'A'], [1, 'B'], [2, 'C'] ] d={} for pair in l: if d.has_key(pair[0]): d[pair[0]]=d[pair[0]]+tuple(pair[1]) else: d[pair[0]]=tuple(pair[1]) print d {1: ('A', 'B'), 2: ('C',)} 

这个任务有没有更优雅的Pythonic解决scheme?

 from collections import defaultdict d1 = defaultdict(list) for k, v in l: d1[k].append(v) d = dict((k, tuple(v)) for k, v in d1.iteritems()) 

d现在包含{1: ('A', 'B'), 2: ('C',)}

d1是一个临时defaultdict列表作为值,将被转换为最后一行中的元组。 这样你就可以追加到列表中,而不是在主循环中重新创build元组。

这种方法相对高效且相当紧凑:

 reduce(lambda x, (k,v): x[k].append(v) or x, l, defaultdict(list)) 

使用列表而不是元组作为字典值:

 l=[ [1, 'A'], [1, 'B'], [2, 'C'] ] d={} for key, val in l: d.setdefault(key, []).append(val) print d 

密钥是否已经在input列表中sorting? 如果是这样的话,你有一个function性的解决scheme:

 import itertools lst = [(1, 'A'), (1, 'B'), (2, 'C')] dct = dict((key, tuple(v for (k, v) in pairs)) for (key, pairs) in itertools.groupby(lst, lambda pair: pair[0])) print dct # {1: ('A', 'B'), 2: ('C',)}