Как добавить каждую n-ую запись в списке Python друг к другу? - PullRequest
0 голосов
/ 21 октября 2018

Допустим, у меня есть список Python:

[4,5,25,60,19,2]

Как я могу добавить каждую n-ую запись друг к другу?

например, я разделил список на 3 записи [4,5 /25,60 / 19,2], затем добавьте эти записи, чтобы получить новый список:

[4+25+19, 5+60+2]

, что дает мне сумму:

[48, 67]

Для более сложного примераДопустим, у меня есть 2000 записей в моем списке.Я хочу добавить каждую сотую запись к предыдущей, чтобы получить 100 записей в новом списке.Каждая запись теперь будет суммой каждой сотой записи.

Ответы [ 4 ]

0 голосов
/ 21 октября 2018

Может быть умная последовательность операций со списком, которую вы могли бы использовать, но я не мог придумать ни одной.Поэтому вместо этого я сделал парсер, который идет от 0 до n-1 и в пределах списка добавляет элементы, идущие через каждый n.Так что, если n = 3, вы идете 0, 3, 6 и т. Д .;затем 1, 4, 7 и т. д. - и поместите его в список вывода.

Код прилагается ниже.Надеюсь, это поможет.

list1 = [7, 6, -5.4, 6, -4, 55, -21, 45, 67, -9, -8, -7, 8, 9, 11, 110, -0.8, -9.8, 1.1]
n = 5

list2 = []
sum_elem = 0

for i in range(n):
    sum_elem = 0
    j = i

    while j < len( list1 ):
        sum_elem += list1[j]
        j += n

    list2.append(sum_elem)

print( list2 )
0 голосов
/ 21 октября 2018

Используя chunks функцию, взятую отсюда , вы можете написать следующее:

def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]

l = [4,5,25,60,19,2]
print([sum(e) for e in list(chunks(l, 2))])
0 голосов
/ 21 октября 2018

Документация itertools имеет функцию рецепта под названием grouper, вы можете импортировать ее из more_itertools (требуется ручная установка) или скопировать и вставить ее.

Это работает так:

>>> from more_itertools import grouper
>>> l = [4,5,25,60,19,2]
>>> list(grouper(2, l)) # 2 = len(l)/3
>>> [(4, 5), (25, 60), (19, 2)]

Вы можете транспонировать вывод grouper с помощью zip и применять sum к каждой группе.

>>> [sum(g) for g in zip(*grouper(2, l))]
>>> [48, 67]

Я предпочитаюэто чтобы вручную возиться с индексами.Кроме того, он работает с любыми повторяемыми, а не только списками.Универсальная итерация может не поддерживать индексацию или нарезку, но она всегда сможет создать поток значений.

0 голосов
/ 21 октября 2018

Итеративно извлекайте свои кусочки и суммируйте их.

>>> [sum(l[i::2]) for i in range(len(l) // 3)]
[48, 67]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...