проблема с циклом 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 шт):
Я предложу свой вариант решения:
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
вроде как поддерживаются отрицательные указатели. То есть последний будет [-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))
И покороче
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))
Генератор 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
Добавлю еще вариант в одну строчку. Перестраиваем исходный список в два новых: первый с переносом первого элемента в конец, второй с переносом последнего элемента в начало.
Полученные два списка через 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