проблема с циклом for в Python

Напишите программу, на вход которой подаётся список чисел одной строкой. Программа должна для каждого элемента этого списка вывести сумму двух его соседей. Для элементов списка, являющихся крайними, одним из соседей считается элемент, находящий на противоположном конце этого списка. Например, если на вход подаётся список "1 3 5 6 10", то на выход ожидается список "13 6 9 15 7" (без кавычек).

Если на вход пришло только одно число, надо вывести его же.

Вывод должен содержать одну строку с числами нового списка, разделёнными пробелом.  При значении с == 3 цикл for не выполняет команду почему?

a = [int(i) for i in input().split()]
b = len(a)-1
long = len(a)
i = 0
for c in range(long+1):
 if long == 1:
        print(a[0])
 elif c == a[0] : # первый символ
        first = a[1] + a[b]
        print(first, end=' ')
        i+=1
 elif c == b : # последний символ
        last = a[-2]+a[0]
        print(last,end=' ')
        break
 elif c > 0  :
       n = (a[i-1]+a[i+1])
       print(n,end=' ')
       i +=1

Ответы (5 шт):

Автор решения: Tehnorobot

Я предложу свой вариант решения:

string = '1 3 5 6 10'
list_vals = [int(i) for i in string.split()]
res = []
for val in range(len(list_vals)):
    if len(list_vals) == 1:
        res.append(list_vals[0])
        break
    elif val == 0:
        res.append(list_vals[-1] + list_vals[1])
    elif val == len(list_vals) - 1:
        res.append(list_vals[-2] + list_vals[0])
    else:
        res.append(list_vals[val - 1] + list_vals[val + 1])

for i in res:
    print(i, end=' ')

Вывод:

13 6 9 15 7
→ Ссылка
Автор решения: A_Vaclav

вроде как поддерживаются отрицательные указатели. То есть последний будет [-1]

    string = '1 3 5 6 10'
    def q_1320361(s):
        #https://ru.stackoverflow.com/questions/1320361/
        tmp = s.split(' ')
        l_tmp = len(tmp)
        if l_tmp == 1: return s
        ts = [int(x) for x in tmp]
        res = [ts[i-1] + ts[i - l_tmp + 1] for i in range(l_tmp)]
        res_s = ' '.join([str(x) for x in res])
        return res_s
    s = string
    print(q_1320361(s))
→ Ссылка
Автор решения: A_Vaclav

И покороче

     def q_1320361_1(s):
         ts = [int(x) for x in s.split(' ')]
         l_tmp = len(ts)
         if l_tmp == 1: return s
         return ' '.join([str(int(ts[i - 1]) + int(ts[i - l_tmp + 1]))
                         for i in range(l_tmp)])
    s = '1 3 5 6 10'
    print(q_1320361_1(s))
→ Ссылка
Автор решения: Stanislav Volodarskiy

Генератор g отвечает за вывод предыдущих и последующих элементов. Вот пример его работы для списка длины 10. Работа основана на поддержке отрицательных индексов при обращении к списку:

g(-1)           ->  9 0 1 2 3 4 5 6 7 8
исходный список ->  0 1 2 3 4 5 6 7 8 9
g(-9)           ->  1 2 3 4 5 6 7 8 9 0

Чтобы получить нужные суммы сложим вывод генераторов поэлементно.

В самом начале функции sums проверка случая когда число только одно:

def sums(a):
    if len(a) <= 1:
        return a

    def g(j):
        return (a[i] for i in range(j, j + len(a)))

    return map(sum, zip(g(-1), g(-len(a) + 1)))


a = tuple(map(int, input().split()))
print(*sums(a))
$ echo 1 3 5 6 10 | python sums.py 
13 6 9 15 7
→ Ссылка
Автор решения: Andy Pavlov

Добавлю еще вариант в одну строчку. Перестраиваем исходный список в два новых: первый с переносом первого элемента в конец, второй с переносом последнего элемента в начало.

Полученные два списка через zip() объединяем и суммируем строки:

inp = '1 3 5 6 10'
nums = list(map(int, inp.split()))
sums = [sum(row) for row in zip([*nums[1:], nums[0]], [nums[-1], *nums[0:-1]])] if len(nums) > 1 else nums
print(*sums, sep=' ')  # 13 6 9 15 7
→ Ссылка