2016-10-12 47 views
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]} 

以上是我一直在努力的代码,但它给出了一个错误

拉链参数#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]} 

的问题与您的代码是你在v映射add_element到每一个单独的元素你的字典里面的理解。这在add_element通过一维列表zip,导致你的错误(因为各个整数不支持迭代

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]} 
+0

As @ juanpa.arrivillaga提到,在Python 3上,你必须使用'list(map(..))' – jamylak

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

+0

非常感谢你jamylak,juanpa.arrivillaga我逐渐想通了,并在我的代码 – Iqbal

+0

返回{k:list(map(sum,zip(* v)))for k,v in dict_1.items()} – Iqbal