字典中列表嵌套的元素求和

6
d = {
  'a': [[1, 2, 3], [1, 2, 3]],
  'b': [[2, 4, 1], [1, 6, 1]],
}

def add_element(lst):
    ad = [sum(i) for i in zip(*lst)]
    return ad

def csv_reducer2(dicty):
    return {k: list(map(add_element, v)) for k, v in dicty.items()}

csv_reducer2(d)

需要输出:

{'b': [3, 10, 2], 'a': [2, 4, 6]}

我一直在尝试上面的代码,但是它会出错。
错误信息如下:
zip参数 #1 必须支持迭代
3个回答

7
>>> d = {'a': [[1, 2, 3], [1, 2, 3]], 'b': [[2, 4, 1], [1, 6, 1]]}
>>> {k: map(sum, zip(*v)) for k, v in d.items()}
{'a': [2, 4, 6], 'b': [3, 10, 2]}

正如@juanpa.arrivillaga所暗示的那样,在Python 3中,您必须使用list(map(..)) - jamylak

4
以下内容适用于Python 2或3:
>>> {k: [a + b for a, b in zip(*v)] for k, v in d.items()}
{'a': [2, 4, 6], 'b': [3, 10, 2]}

你代码的问题在于你在字典理解中将add_element映射到v中的每个单独元素。这会向add_element中的zip传递一个一维列表,导致错误(因为单个整数不支持迭代)。

4
为了修复您的原始代码,您唯一需要做出的更改是:
return {k: list(map(add_element, v)) for k, v in dicty.items()}

->

return {k: add_element(v) for k, v in dicty.items()}

因为zip(*lst)试图将多行转置为列,但你只通过原始的map传递了单行。

非常感谢jamylak和juanpa.arrivillaga,我逐渐弄明白了,并在我的代码中做出了改变。 - Iqbal
返回 {k: list(map(sum, zip(*v))) for k, v in dict_1.items()} - Iqbal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接