Суммирование элементов словаря, которые являются списком списков

#python #list #dictionary

#python #Список #словарь

Вопрос:

 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 должен поддерживать итерацию

Ответ №1:

 >>> 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. Как упоминал @juanpa.arrivillaga, на Python 3 вы должны использовать list(map(..))

Ответ №2:

Следующее будет работать на 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 in add_element , что приводит к вашей ошибке (поскольку отдельные целые числа не поддерживают итерацию.

Ответ №3:

Чтобы исправить исходный код, единственное изменение, которое вам нужно внести, это:

 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

Комментарии:

1. Большое вам спасибо jamylak, juanpa.arrivillaga Я постепенно разобрался и внес изменения в свой код

2. возвращает {k: list(map(sum, zip(*v))) для k, v в dict_1.items()}