Встроенная функция sum(). Не работает для списка списков
Если интересно, то задача возникла из необходимости объединить коды цветов точек в один список. То есть у меня 3n точек, идущих последовательно n штук одного цвета. Естественно, я воспользовал автогенерацией (comprehensive list):
cc = [n * [color, ] for color in ['tab:blue', 'tab:orange', 'tab:green'] ]
Например при n == 2 получим:
cc
Out[24]:
[['tab:blue', 'tab:blue'],
['tab:orange', 'tab:orange'],
['tab:green', 'tab:green']]
теперь очевидно
cc[0] + cc[1] + cc[2]
Out[25]: ['tab:blue', 'tab:blue', 'tab:orange', 'tab:orange', 'tab:green', 'tab:green']
однако желаемое применение встроенной функции sum() приводит к прерыванию.
sum(cc)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-26-175665ff078b> in <module>
----> 1 sum(cc)
TypeError: unsupported operand type(s) for +: 'int' and 'list'
Не понимаю - о каком "инте" здесь идет речь.
Протрите мне глаза пжста....
Выход я нашел:
import itertools
[el for el in itertools.chain(*cc)]
Out[33]: ['tab:blue', 'tab:blue', 'tab:orange', 'tab:orange', 'tab:green', 'tab:green']
Однако как говорит Хеттингер - "Должен быть лучший путь". Ведь sum() должна бы работать, не правда ли?
Ответы (1 шт):
sum(iterable, start)
Return the sum of a 'start' value (default: 0) plus an iterable of numbers
У sum есть параметр - начальное значение, с которым складывать элементы. По умолчанию там 0, поэтому выходит такая ошибка. Но там можно прописать пустой список, и всё сработает:
sum(cc, [])