#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()}