作为列表列表的字典元素的总和

时间:2016-10-12 23:56:33

标签: python list dictionary

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 个答案:

答案 0 :(得分: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]}

答案 1 :(得分: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中的每个元素。这会将一维列表传递给zip中的add_element,从而导致错误(因为单个整数不支持迭代。

答案 2 :(得分: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