3 回答

TA贡献1783条经验 获得超4个赞
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,列表作为值,将在最后一行转换为元组。这样,您将追加到列表,而不在主循环中重新创建元组。

TA贡献1854条经验 获得超8个赞
此方法相对有效且非常紧凑:
reduce(lambda x, (k,v): x[k].append(v) or x, l, defaultdict(list))
在Python3中,这变成了(使导出明确):
dict(functools.reduce(lambda x, d: x[d[0]].append(d[1]) or x, l, collections.defaultdict(list)))
请注意,reduce已移至functools,并且lambda不再接受元组。此版本仍适用于2.6和2.7。

TA贡献1780条经验 获得超5个赞
使用列表代替元组作为dict值:
l=[ [1, 'A'], [1, 'B'], [2, 'C'] ]
d={}
for key, val in l:
d.setdefault(key, []).append(val)
print d
添加回答
举报