为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英4014372 2019-12-25 14:51:56
我有一个包含一对键/值的Python列表:l=[ [1, 'A'], [1, 'B'], [2, 'C'] ]我想将列表转换成字典,其中每个键的多个值将聚合到一个元组中:{ 1:('A', 'B'), 2:('C',) }迭代解决方案很简单: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解决方案来执行此任务?
查看完整描述

3 回答

?
慕娘9325324

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,列表作为值,将在最后一行转换为元组。这样,您将追加到列表,而不在主循环中重新创建元组。


查看完整回答
反对 回复 2019-12-25
?
哔哔one

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。


查看完整回答
反对 回复 2019-12-25
?
翻阅古今

TA贡献1780条经验 获得超5个赞

使用列表代替元组作为dict值:


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

d={}

for key, val in l:

    d.setdefault(key, []).append(val)


print d


查看完整回答
反对 回复 2019-12-25
  • 3 回答
  • 0 关注
  • 399 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信