如何将
[(a, 1), (b, 2), (a, 3)]
转成
{
a: [1, 3]
b: [2]
}
想用一个列表生成来做,有什么好的方法么?
不是一个列表生成的:
from collections import defaultdict
s = [('a', 1), ('b', 2), ('a', 3)]
d = defaultdict(list)
for k, v in s:
d[k].append(v)
print(d.items())
s = [('a', 1), ('b', 2), ('a', 3)]
l = {'a':[i[1] for i in s if i[0] == 'a'],
'b':[i[1] for i in s if i[0] == 'b']
}
这个意思?
个人觉得 列表生成不适合用来做这些操作, 规范点会比较好
from collections import defaultdict
result = defaultdict(list)
s = [('a', 1), ('b', 2), ('a', 3)]
for i in s:
result[i[0]].append(i[1])
我还没想到比
l = [('a', 1), ('b', 2), ('a', 3)]
d = {}
for k, v in l:
d.setdefault(k, []).append(v)
print(d)
更简洁的方法。
强求使用字典推导,写出冗长的一行,就像初学英语滥用从句。也许作为思维训练有意义,从实用和代码审美上没有意义。
效率上讲,中间绕了很大一个圈子,嵌套的高阶函数调用,很是浪费。
至于 @藕丝空间 说的,我觉得楼主的写法并不是这个问题,楼主的推导式写法是在创建字典时展开grouby处理好的生成器,并不是迭代时修改。
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
感谢各位的回答,我找到一个比较好的备选方案