документация для стандартного itertools модуля имеет этот рецепт для разделения списка на фиксированную длину группу:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
Как новичок, вы не могли бы понять, как это работает, но я сделал это, чтобы подтвердить, что он делает:
import itertools as it
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return it.zip_longest(*args, fillvalue=fillvalue)
list1 = [1,3,5,7,9,11,13,15,17]
print(list(grouper(list1, 3)))
печатает: [(1, 3, 5), (7, 9, 11), (13, 15, 17)]
. Таким образом, у вас есть кортежи каждых трех пунктов, теперь вам просто нужно добавить их, которая является то, что встроенный sum
для:
list2 = [sum(group) for group in grouper(list1, 3)]
Если список является длиной, которая не делится на 3, то это будет перерыв с ошибкой, как это:
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
который может быть установлен в одном из двух способов: если вы хотите игнорировать нечетные элементы, изменить grouper
позвонить zip
, где он в настоящее время вызывает it.zip_longest
; с другой стороны, если вы хотите, конечный элемент в list2
, что является суммой нечетных элементов, используйте значение заполнения 0, как это:
list2 = [sum(group) for group in grouper(list1, 3, 0)]
это поможет: http://stackoverflow.com/questions/14680273/finding-every-nth-element-in-a-list – smoggers
@smoggers На самом деле О.П. хочет * добавить каждый третий элемент в list2 *, например '1 + 3 + 5',' 9', а '7 + 9 + 11' -' 27' и т. д. –
ваш вопрос хороший, но он не следует руководящие принципы о том, как его следует задавать. SO не является кодовым письмом. Пожалуйста, отредактируйте ваш вопрос и добавьте код, который вы пробовали до сих пор – Pynchia