Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Как узнать сумму соседних элементов для каждого элемента из списка

#python #python_3x


Здравствуйте! Изучаю Python, попалась такая задача:

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

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

В моём варианте пишет, что ошибка в строке 8, мол, не знает числа с таким индексом.
Подскажите, пожалуйста, что я делаю не так, в чём ошибка? 

a = [int(x) for x in input().split()]
b = []
i = 0
if len (a) == 1:
    print(a)
else:
    for c in a:
        b.append(int(a[i - 1]) + int(a[i + 1]))
        i = i + 1
print(b)

    


Ответы

Ответ 1



Да, ошибка в том, что вы обращаетесь к элементу за пределами массива. Можно исправить, явно обозначив границы окна, в котором вы считаете сумму. Так можно обойтись без лишних условий на конец массива или использования кольцевого буфера: initial_list = [1, 3, 5, 6, 10] sum_list = [] left_index = -1 right_index = -len(initial_list) + 1 middle_index = 0 while middle_index < len(initial_list): print(left_index, right_index) sum_list.append(initial_list[left_index] + initial_list[right_index]) left_index += 1 right_index += 1 middle_index += 1 print(sum_list) Отрицательный индекс - это индекс "с конца" массива. Код можно переписать и покороче, опустив объявления границ скользящего окна: sum_list.append(initial_list[middle_index - 1] + initial_list[middle_index - len(initial_list) + 1]) Следуя по пути сокращения строк и далее, можно все записать в одну строку: sum_list = [initial_list[index - 1] + initial_list[index - len(initial_list) + 1] for index, element in enumerate(initial_list)] print(sum_list)

Ответ 2



Питон не C, поэтому вместо обращения по индексу к элементам списка, можно получать элементы напрямую, работая со всем списком сразу: #!/usr/bin/env python3 line = input("Введите список целых чисел, разделённых пробелами: ") numbers = list(map(int, line.split())) if len(numbers) == 1: print(numbers[0]) else: neighbours = numbers[-1:] + numbers + numbers[:1] print(*[a + b for a, b in zip(neighbours, neighbours[2:])]) Если не ясно, что какая-то часть скрипта делает, то можно поиграться с отдельными выражениями в интерактивной консоле (запущенной, к примеру, с помощью python -i ваша-программа.py) и почитать соответствующую документацию для функций c помощью команды help(zip): >>> list(zip([1,2], "ab")) [(1, 'a'), (2, 'b')] >>> print(*[1, 2, 3]) 1 2 3

Комментариев нет:

Отправить комментарий