Списки — просто!

Срезы

Со списками, так же как и со строками, можно делать срезы. А именно:

A[i:j]  срез из j-i элементов A[i], A[i+1], ..., A[j-1].

A[i:j:-1]  срез из i-j элементов A[i], A[i-1], ..., A[j+1] (то есть меняется порядок элементов).

A[i:j:k]  срез с шагом k: A[i], A[i+k], A[i+2*k],... . Если значение k<0, то элементы идут в противоположном порядке.

Каждое из чисел i или j может отсутствовать, что означает “начало строки” или “конец строки”

Списки, в отличии от строк, являются изменяемыми объектами: можно отдельному элементу списка присвоить новое значение. Но можно менять и целиком срезы. Например:

A = [1, 2, 3, 4, 5]
A[2:4] = [7, 8, 9]

Получится список, у которого вместо двух элементов среза A[2:4] вставлен новый список уже из трех элементов. Теперь список стал равен [1, 2, 7, 8, 9, 5].

A = [1, 2, 3, 4, 5, 6,  7]
A[::-2] = [10, 20, 30, 40]

Получится список [40, 2, 30, 4, 20, 6, 10]. Здесь A[::-2] — это список из элементов A[-1], A[-3], A[-5], A-7, которым присваиваются значения 10, 20, 30, 40 соответственно.

Если не непрерывному срезу (то есть срезу с шагом k, отличному от 1), присвоить новое значение, то количество элементов в старом и новом срезе обязательно должно совпадать, в противном случае произойдет ошибка ValueError.

Обратите внимание, A[i] — это элемент списка, а не срез!

Операции со списками

Со списками можно легко делать много разных операций.

x in A Проверить, содержится ли элемент в списке. Возвращает True или False
x not in A То же самое, что not(x in A)
min(A) Наименьший элемент списка
max(A) Наибольший элемент списка
sum(A) Сумма элементов списка
A.index(x) Индекс первого вхождения элемента x в список, при его отсутствии генерирует исключение ValueError
A.count(x) Количество вхождений элемента x в список
A.pop() Удаляет последний элемент из списка и возвращает его значение
A.pop(x) Удаляет x-овый элемент из списка и возвращает его значение

Упражнения

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

В этом же листке, наоборот, нельзя использовать циклы. Используйте срезы и методы.

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

Если программа решается в одну строку, то необходимо использовать функции внутри функций. Например, вот так можно вычислить сумму всех чисел, введенных в строку, используя стандартную функцию sum:

print(sum(list(map(int, input().split()))))

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

Решение в две строки строки, как правило, должно иметь следующий вид:

A = input().split()
print(' '.join(...))

При этом зачастую не требуется преобразовывать элементы списка к типу int.

Решение в три строки строки, как правило, должно иметь следующий вид:

A = input().split()
A = ...
print(' '.join(...))

A: Четные индексы

Выведите все элементы списка с четными индексами (то есть A[0], A[2], A[4], ...).

Решите эту задачу в одну строку

Ввод Вывод
1 2 3 4 5
1 3 5

G: Наибольший элемент

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

Решите эту задачу в две строки

Ввод Вывод
1 2 3 2 1
3 2

L: Вывести в обратном порядке

Выведите элементы данного списка в обратном порядке.

Решите эту задачу в одну строку

Ввод Вывод
1 2 3 4 5
5 4 3 2 1

N: Переставить соседние

Переставьте соседние элементы списка (A[0] c A[1], A[2] c A[3] и т.д.). Если элементов нечетное число, то последний элемент остается на своем месте.

Решите эту задачу в три строки

Ввод Вывод
1 2 3 4 5
2 1 4 3 5

O: Циклический сдвиг вправо

Циклически сдвиньте элементы списка вправо (A[0] переходит на место A[1], A[1] на место A[2], ..., последний элемент переходит на место A[0]).

Решите эту задачу в три строки.

Третья строка при этом должна выглядеть так: print(*a)

Ввод Вывод
1 2 3 4 5
5 1 2 3 4

Q: Удалить элемент

Дан список из чисел и индекс элемента в списке k. Удалите из списка элемент с индексом k, сдвинув влево все элементы, стоящие правее элемента с индексом k.

Программа получает на вход список, затем число k.

Программа должна осуществлять сдвиг непосредственно в списке, а не делать это при выводе элементов. Также нельзя использовать дополнительный список.

Последняя строка в обоих случаях должна быть такой: print(*a)

Ввод Вывод
7 6 5 4 3 2 1
2
7 6 4 3 2 1

R: Вставить элемент

Дан список целых чисел, число k и значение C. Необходимо вставить в список на позицию с индексом k элемент, равный C, сдвинув все элементы имевшие индекс не менее k вправо.

Решите эту задачу в четыре строки

Вторая строка — такая: nomer, element = map(int, input().split()). А четвертая такая: print(*a)

Ввод Вывод
7 6 5 4 3 2 1
2 0
7 6 0 5 4 3 2 1

Z: Большой сдвиг

Дан список из N (1 ≤ N ≤ 100000) целых чисел и число K (|K| < 100000 ). Циклически сдвиньте список на |K| элементов вправо, если K – положительное и влево, если отрицательное число.

Программа получает на вход список целых чисел, затем число K.

Решите эту задачу в три строки

Ввод Вывод
5 3 7 4 6
3
7 4 6 5 3