Сумма последовательных пар в списке, включая сумму последнего элемента с первым - PullRequest
6 голосов
/ 02 августа 2020

У меня есть список элементов вроде [1,3,5,6,8,7]. Мне нужен список сумм двух последовательных элементов списка таким образом, чтобы последний элемент также добавлялся к первому элементу списка. Я имею в виду, что в приведенном выше случае мне нужен этот список: [4,8,11,14,15,8]

Но когда дело доходит до добавления последнего и первого элементов в течение l oop, индекс выходит за пределы допустимого диапазона. Рассмотрим следующий код:

List1 = [1,3,5,6,8,7]
List2 = [List1[i] + List1[i+1] for i in range (len(List1))]

print(List2)

Ответы [ 9 ]

4 голосов
/ 02 августа 2020
[List1[i] + List1[(i+1) % len(List1)] for i in range(len(List1))]

или

[sum(tup) for tup in zip(List1, List1[1:] + [List1[0]])]

или

[x + y for x, y in zip(List1, List1[1:] + [List1[0]])]  
4 голосов
/ 02 августа 2020
List2 = [List1[i] + List1[(i+1)%len(List1)] for i in range (len(List1))]
2 голосов
/ 02 августа 2020

Это вращает список

In [9]: List1[1:] + List1[:1]                                                                 
Out[9]: [3, 5, 6, 8, 7, 1]

Таким образом, следующее работает отлично

In [8]: [x + y for x, y in zip(List1, List1[1:] + List1[:1])]                                 
Out[8]: [4, 8, 11, 14, 15, 8]
2 голосов
/ 02 августа 2020

Из-за i+1 индекс выходит за пределы диапазона

List1 = [1,3,5,6,8,7]
List2 = [List1[i-1] + List1[i] for i in range (len(List1))]

print (List2)

Это вроде как работает
Результат:

[8, 4, 8, 11, 14, 15]
1 голос
/ 02 августа 2020

Еще несколько ответов pythoni c, на которые еще не ответили:

Использование map может быть более читаемым:

List2 = list(map(sum, zip(List1, List1[1:] + List1[:1])))

Вы также можете использовать itertools для смещения список:

import itertools
List2 = list(map(sum, zip(List1, itertools.islice(itertools.cycle(List1), 1, None))))
1 голос
/ 02 августа 2020

Вот еще одно неприятное решение:

List1 = [1,3,5,6,8,7] 
List2 = [List1[i] + (List1+[List1[0]])[i+1] for i in range (len(List1))]

print (List2)
1 голос
/ 02 августа 2020

Когда i == 5, он вводит оператор «if», а i устанавливается в -1. Обратите внимание, что List[-1] совпадает с List[len(List) - 1], что означает, что List[i+1] станет List[0], первым элементом списка.

for i in range(len(List1)):
    if i == len(List1) - 1:
        i = -1
    List2.append(List1[i] + List1[i+1])
1 голос
/ 02 августа 2020

Когда вы запускаете его в len (List1) - 1 Итак, когда значение i будет len (List1) - 1, тогда i + 1 будет вне диапазона (например, len (List1)), поэтому вы можете попробуйте это решение:

List2 = [List1[i-1] + List1[i] for i in range (len(List1))]

Или вы можете сделать:

List2 = [List1[i] + List1[i+1] for i in range (len(List1)-1)]

Или вы также можете использовать любой другой logi c. Ура!

1 голос
/ 02 августа 2020

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

List1 = [1,3,5,6,8,7]
List2 = [List1[i] + List1[i+1] for i in range (len(List1) - 1)]
List2.append(List1[0] + List1[-1])

print (List2)
...