Со списками, так же как и со строками, можно делать срезы. А именно:
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[0]
, A[2]
, A[4]
, ...).
Решите эту задачу в одну строку
Ввод | Вывод |
---|---|
1 2 3 4 5 |
1 3 5 |
Дан список чисел. Выведите значение наибольшего элемента в списке, а затем индекс этого элемента в списке. Если наибольших элементов несколько, выведите индекс первого из них.
Решите эту задачу в две строки
Ввод | Вывод |
---|---|
1 2 3 2 1 |
3 2 |
Выведите элементы данного списка в обратном порядке.
Решите эту задачу в одну строку
Ввод | Вывод |
---|---|
1 2 3 4 5 |
5 4 3 2 1 |
Переставьте соседние элементы списка (A[0]
c A[1]
,
A[2]
c A[3]
и т.д.).
Если элементов нечетное число, то последний элемент остается на своем месте.
Решите эту задачу в три строки
Ввод | Вывод |
---|---|
1 2 3 4 5 |
2 1 4 3 5 |
Циклически сдвиньте элементы списка вправо
(A[0]
переходит на место A[1]
,
A[1]
на место A[2]
, ...,
последний элемент переходит на место A[0]
).
Решите эту задачу в три строки.
Третья строка при этом должна выглядеть так: print(*a)
Ввод | Вывод |
---|---|
1 2 3 4 5 |
5 1 2 3 4 |
Дан список из чисел и индекс элемента в списке k. Удалите из списка элемент с индексом k, сдвинув влево все элементы, стоящие правее элемента с индексом k.
Программа получает на вход список, затем число k
.
Программа должна осуществлять сдвиг непосредственно в списке, а не делать это при выводе элементов. Также нельзя использовать дополнительный список.
Последняя строка в обоих случаях должна быть такой: print(*a)
Ввод | Вывод |
---|---|
7 6 5 4 3 2 1 |
7 6 4 3 2 1 |
Дан список целых чисел, число k
и значение C
.
Необходимо вставить в список на позицию с индексом k
элемент,
равный C
, сдвинув все элементы имевшие индекс не менее k
вправо.
Решите эту задачу в четыре строки
Вторая строка — такая: nomer, element = map(int, input().split())
.
А четвертая такая: print(*a)
Ввод | Вывод |
---|---|
7 6 5 4 3 2 1 |
7 6 0 5 4 3 2 1 |
Дан список из N (1 ≤ N ≤ 100000) целых чисел и число K (|K| < 100000 ). Циклически сдвиньте список на |K| элементов вправо, если K – положительное и влево, если отрицательное число.
Программа получает на вход список целых чисел, затем число K.
Решите эту задачу в три строки
Ввод | Вывод |
---|---|
5 3 7 4 6 |
7 4 6 5 3 |