2015-10-10 3 views
-4
list1 = [1,3,5,7,9,11,13,15,17] 
list2 = [] 

Я хочу, чтобы добавить три первые элементы в list2[0] и в ближайшие три list2[1] и так далее.Суммируя группы элементов в списке

1+3+5 is list2[0] 
7+9+11 is list2[1] 
13+15+17 is list2[2] 

результат должен быть:

list2 = [9,27,45] 
+0

это поможет: http://stackoverflow.com/questions/14680273/finding-every-nth-element-in-a-list – smoggers

+0

@smoggers На самом деле О.П. хочет * добавить каждый третий элемент в list2 *, например '1 + 3 + 5',' 9', а '7 + 9 + 11' -' 27' и т. д. –

+0

ваш вопрос хороший, но он не следует руководящие принципы о том, как его следует задавать. SO не является кодовым письмом. Пожалуйста, отредактируйте ваш вопрос и добавьте код, который вы пробовали до сих пор – Pynchia

ответ

4

документация для стандартного 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)] 
1

Все, что вам нужно сделать, это добавить элементы из 3 * я на 3 * (я + 1) , где я это будет показатель из новый песни2

>>> list1 = [1,3,5,7,9,11,13,15,17] 
>>> list2=[] 
>>> for i in range(len(list1)/3): 
    ...  list2.append(sum(list1[i*3:(i+1)*3])) 
>>> list2 
[9, 27, 45] 
+2

Это работает нормально, если длина списка делится на 3, но вы должны использовать '// 3', чтобы гарантировать целочисленное деление. Кроме того, более эффективно использовать шаг 3 в «диапазоне» (как в варианте LetzerWille), а не использовать эти умножения и деления на 3. –

3

Попробуйте с

gr = [iter(list1)]*3 
list2 = [sum(el) for el in zip(*gr)] 
# or as an alternative 
# list2 = list(map(sum, zip(*gr))) 
print(list2) 

, который производит

[9, 27, 45] 

это работает, если количество элементов в списке ввода кратен 3.

В случае, если вы хотите, чтобы заставить его работать на других длинах, а также сделать

from itertools import zip_longest 
list1 = [1,3,5,7,9,11,13,15,17, 1,2] 
gr=[iter(list1)]*3 
list2 = [sum(el) for el in zip_longest(*gr, fillvalue=0)] 
# or as an alternative 
# list2 = list(map(sum, zip_longest(*gr, fillvalue=0))) 

print(list2) 

который производит

[9, 27, 45, 3] 

EDIT: другое решение использовать itertools.groupby

from itertools import groupby 
g = groupby(enumerate(list1), lambda p, _: p//3) 
list2 = [sum(v for p,v in t) for i, t in g] 
print(list2) 

, который работает для списков любой длины (несколько из трех или не)

+0

В случае, пожалуйста, примите ответ @ Ivc (upvoted). Он избил меня на несколько минут. :) – Pynchia

+0

люди на этом веб-сайте, никогда не вернутся! , но спасибо за отличный ответ tho :)) –

+0

ПОЖАЛУЙСТА, примите вместо этого lvc anser. Было бы справедливо. В противном случае я удалю свой ответ. ПОЖАЛУЙСТА. – Pynchia

1
list1 = [1,3,5,7,9,11,13,15,17] 
# split list1 into 3 sublists 
list2 = [list1[i:i + 3] for i in range(0, len(list1), 3)] 
# map sum to sublists in list2 
list2 = list(map(sum,list2)) 
print(list2) 
[9, 27, 45] 
2

Вот несколько других способов.Обратите внимание, что (как и в большинстве ответов, уже представленных) частичная группа из менее чем 3 элементов будет проигнорирована моими первыми двумя методами, но последняя будет обрабатывать такие частичные группы.

list1 = [1,3,5,7,9,11,13,15,17, 30, 40] 
print list1 

list2 = [sum(t) for t in zip(*[iter(list1)]*3)] 
print list2 

list2 = [i + j + k for i,j,k in zip(list1[0::3], list1[1::3], list1[2::3])] 
print list2 

list2 = [] 
s = 0 
for i, v in enumerate(list1, 1): 
    s += v 
    if i % 3 == 0: 
     list2.append(s) 
     s = 0 
if s: 
    list2.append(s)  
print list2 

выход

[1, 3, 5, 7, 9, 11, 13, 15, 17, 30, 40] 
[9, 27, 45] 
[9, 27, 45] 
[9, 27, 45, 70] 
Смежные вопросы