【发布时间】:2012-03-06 08:36:22
【问题描述】:
生成器表达式正在抛出大量元组对,例如。列表形式:
pairs = [(3, 47), (6, 47), (9, 47), (6, 27), (11, 27), (23, 27), (41, 27), (4, 67), (9, 67), (11, 67), (33, 67)]
对于成对的每一对,key = pair[0] 和 value = pair[1],我想将这个对流输入到字典中,以累积添加各个键的值。显而易见的解决方案是:
dict_k_v = {}
for pair in pairs:
try:
dict_k_v[pair[0]] += pair[1]
except:
dict_k_v[pair[0]] = pair[1]
>>> dict_k_v
{33: 67, 3: 47, 4: 67, 6: 74, 9: 114, 11: 94, 41: 27, 23: 27}
但是,这可以通过生成器表达式或不使用 for 循环的类似构造来实现吗?
编辑
为了澄清,生成器表达式抛出了大量的元组对:
(3, 47), (6, 47), (9, 47), (6, 27), (11, 27), (23, 27), (41, 27), (4, 67) , (9, 67), (11, 67), (33, 67) ...
并且我想在生成每对键值对时将每个键值对累积到字典中(请参阅 Paul McGuire 的答案)。 pair = list[] 声明是不必要的,对此感到抱歉。对于每一对 (x,y),x 是整数,y 可以是整数或小数/浮点数。
我的生成器表达式是这样的:
((x,y) for y in something() for x in somethingelse())
并希望将每个 (x,y) 对累积到默认字典中。嗯。
【问题讨论】:
-
最近对 for 循环的厌恶是什么?将累加包裹到 defaultdict 中的 for 循环是最干净的解决方案。
-
我刚刚就推入 dict 的所有选项进行了长时间讨论,结果证明最有效的编码方法是使用 if key in dict: / else: (不是你想要的使用 for 循环 :-)
-
@PaulMcGuire 当数据集非常大和/或连续执行操作时,对 for 循环的主要厌恶可能会影响性能。一种选择是 Cython,但我想看看是否有使用内置函数的 Python 解决方案。
-
@pietdelport 在他的回答中,Paul McGuire 明确地添加了我认为显而易见的问题(哎呀!),即。 “...接受发送给它的每个键值对,并将它们全部累积到传递给它的 defaultdict 中”。我已将此添加到原始问题中。
标签: python dictionary generator