列表字典转换与每个键多个值?
我有一个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',)}