К содержанию

Анатолий
Анатольевич
Eфремов

Списки


Списки (в большинстве же языков программирования используется другой термин — «массив») — это такая структура данных, которая позволяет хранить в себе несколько однотипных значений, таких как числа или строки. Например, если мы хотим проверить число на простоту, а потом построить его разложение на простые множители, нам удобно создать список простых чисел. Тогда мы сможем проверять делимость числа на все ранее построенные элементы списка.

Список в Python представляет собой последовательность элементов, пронумерованных от 0, как символы в строке.
Тогда список, состоящий из n элементов, будет заканчиваться элементом с индексом n - 1.


Пример:

Список можно задать перечислением элементов списка в квадратных скобках, например, список из первых 6 простых чисел можно задать так:

p = [2, 3, 5, 7, 11, 13]
В списке p — 6 элементов, а именно, p[0] == 2, p[1] == 3, p[2] == 5, p[3] == 7, p[4] == 11, p[5] == 13.

Также как и символы строки, элементы списка в Python можно индексировать отрицательными числами с конца, например, p[-1] == 13. Длину списка, то есть количество элементов в нём, можно узнать при помощи функции len(), например, len(p) == 6.

Если мы попробуем обратиться к элементу списка по некорректному индексу, например, обратимся к элементу p[6], то произойдёт ошибка IndexError: list index out of range.


Пример:

Пусть теперь мы хотим перебрать все элементы списка, при этом выводя их на экран, а потом возводя в квадрат. Организуем цикл следующим образом:

for i in range(len(p)):
     print(p[i])
     p[i] = p[i] ** 2

Таким образом, при использовании списков можно присваивать элементам новые значения, в отличие от работы со строками.


Пример:

Пусть нам необходимо хранить базу данных учащихся некоторой школы, содержащую данные об учащихся и их оценках для ведения электронного дневника. Заведем списки для хранения имен учащихся names и для хранения их оценок scores, причём элементы с одинаковыми индексами будут соответствовать один и тем же ученикам. Выведем данные, пронумеровав записи, с помощью следующей программы:

names = ['Иванов', 'Петров', 'Королев']
scores = [5, 4, 5]
for i in range(len(scores)):
     print(i + 1, '.', sep = '', end = ' ')
     print(names[i], scores[i])

На выходе получим:

1. Иванов 5
2. Петров 4
3. Королев 5


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

Для списков целиком определены следующие операции: конкатенация списков (добавление одного списка в конец другого) и повторение списков (умножение списка на число). Например:

a = [1, 2, 3]
b = [4, 5]
c = a + b
d = a * 10

В результате приведенных выше операций список c будет равен [1, 2, 3, 4, 5], а список d будет состоять из 30 элементов, из элементов 1, 2, 3, повторенных 10 раз.


Создание списков

Операция повторения списка позволяет конструировать большие списки. Например, списки с 1000 элементов, заполненных нулями.

a = [0] * 1000

Рассмотрим другой способ создания списков — при помощи метода append, позволяющего помещать элементы в конец списка. Прежде всего можно создать пустой список (не содержащий элементов, имеющий длину 0), в конец списка можно последовательно добавлять элементы.

a = []
for i in range(1000):
     a.append(0)

Ноль можно заменить любым другим выражением.

a = []
for i in range(1000):
     a.append(i)

В полученном списке будет 1000 элементов — от 0 до 999.



Задача 1

Список одинаковых чисел

Вам дано число N и число X. Выведите число X ровно N раз в формате [X, X, X,... ,X]. Используйте функцию print() для вывода списка.

Входные данные

В двух строках входных данных заданы натуральные числа N (N ⩽ 1000) и X (X ⩽ 109).

Выходные данные

Выведите ответ на задачу.

Примеры

Ввод Вывод
5
6
[6, 6, 6, 6, 6]

ОТВЕТ:
n = int(input())
x = int(input())
print([x] * n)



Задача 2

Список квадратов

Дано число N. Выведите N квадратов чисел от 1 до N (включительно) в формате [1, 4, 9, 16,..., N**2]. Используйте функцию print() для вывода списка.

Входные данные

В одной строчке дано натуральное число N ⩽ 200.

Выходные данные

Список квадратов в указанном формате.

Примеры

Ввод Вывод
5 [1, 4, 9, 16, 25]

ОТВЕТ:
n = int(input())
print([i ** 2 for i in range(1, n + 1)])


Методы split и join



Метод split

Элементы списка, разделённые пробелами, могут при вводе находиться в одной строке. В этом случае строку можно считать функцией input(). После этого можно использовать метод строки split, возвращающий список строк, разрезав исходную строку на части по пробелам.


Пример:

a = input().split()

Если при запуске этой программы ввести строку '2 3 5 7 11', то список a будет равен ['2', '3', '5', '7', '11']. Обратите внимание, что список будет состоять из строк, а не из чисел! Если хочется получить список именно из чисел, то можно элементы списка по одному преобразовать в числа:

for i in range(len(a)):
     a[i] = int(a[i])

В результате получим список, состоящий из чисел: [2, 3, 5, 7, 11]

Используя функции языка map() и list() то же самое можно сделать в одну строку:

a = list(map(int, input().split()))

Здесь манипулятор map() применяет функцию int() сразу ко всем элементам, полученным после разделения строки, и организует из них список list. Если нужно считать список действительных чисел, то в данной записи необходимо заменить int() на float().

Подобным способом можно считать и несколько отдельных переменных из одной строки. В этом случае распаковка по переменным считанных данных произойдет автоматически:

n, k = map(int, input().split())


Метод join

Научимся выводить элементы списка в одной строке через пробел при помощи однострочной команды. Для этого используется метод join. У этого метода один параметр — список строк. В результате получается строка, которая является соединением элементов списка (которые были переданы в качестве параметра). При этом между элементами списка вставляется разделитель, равный той строке, к которой применяется метод. Например, программа

a = ["red", "green", "blue"]
print(" ".join(a))
print("***".join(a))
print("".join(a))

выведет строки "red green blue", "red***green***blue" и "redgreenblue".


Следующая программа выведет считанные слова в столбец по одному в каждой строке. Здесь символ \n обзначает переход на новую строчку:

print("\n".join(input().split()))


Если список состоит из чисел, то придется использовать функцию map(). То есть вывести элементы списка чисел, разделяя их пробелами, можно, предварительно преобразовав их в строки следующим образом:

print(" ".join(map(str, a)))



Задача 3

Чётные элементы

Выведите все чётные элементы списка.

Входные данные

Вводится список чисел. Все числа списка находятся на одной строке и не превосходят по модулю 1000.

Выходные данные

Выведите ответ на задачу.

Примеры

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

ОТВЕТ:
a = list(map(int, input().split()))
for i in range(len(a)):
     if a[i] % 2 == 0:
          print(a[i], end=' ')



Задача 4

Чётные индексы

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

Программа должна быть эффективной и не выполнять лишних действий!

Входные данные

Вводится список чисел. Все числа списка находятся на одной строке и не превосходят по модулю 1000.

Выходные данные

Выведите ответ на задачу.

Примеры

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

ОТВЕТ:
a = list(map(int, input().split()))
for i in range(0, len(a)):
     if i % 2 == 0:
          print(a[i], end=' ')



Линейный поиск



Задача

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


1-й способ решения

key = int(input())
a = list(map(int, input().split()))
idx = -1
for i in range(len(a)):
     if a[i] == key:
          idx = i
          print(idx)
          break
if idx == -1:
     print("нет")


2-й способ решения

key = int(input())
a = list(map(int, input().split()))
found = False
for i in range(len(a)):
     if a[i] == key:
          print(i)
          found = True
          break
if not found:
     print("нет")


3-й способ решения

key = int(input())
a = list(map(int, input().split()))
for i in range(len(a)):
     if a[i] == key:
          print(i)
          break
else:
     print("нет")


4-й способ решения

key = int(input())
a = list(map(int, input().split()))
i = 0
while i < len(a) and a[i] != key:
     i += 1
if i < len(a):
     print(i)
else:
     print("нет")



Задача 5

Больше своих соседей

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

Входные данные

Вводится список целых чисел. Все числа списка вводятся на одной строке, разделённые пробелом, и не превосходят по модулю 231.

Выходные данные

Выведите ответ на задачу.

Примеры

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

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

ОТВЕТ:
a = list(map(int, input().split()))
count = 0
for i in range(1, len(a) - 1):
     if int(a[i - 1]) < int(a[i]) and int(a[i]) > int(a[i + 1]):
          count += 1
print(count)



Задача 6

Соседи одного знака

Дан список чисел. Если в нем есть два соседних элемента одного знака, выведите эти числа. Если соседних элементов одного знака нет — не выводите ничего. Если таких пар соседей несколько — выведите первую пару.

Входные данные

Вводится список чисел. Все числа списка находятся на одной строке и не превосходят по модулю 1000.

Выходные данные

Выведите ответ на задачу.

Примеры

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

ОТВЕТ:
a = input().split()
for i in range(len(a) - 1):
     n1 = int(a[i])
     i += 1
     n2 = int(a[i])
     if (n1 * n2) > 0:
          print(n1, n2, end=' ')
          break



Задача 7

Наименьший положительный

Выведите значение наименьшего из всех положительных элементов в списке. Известно, что в списке есть хотя бы один положительный элемент.

Входные данные

Вводится список чисел. Все числа списка находятся на одной строке и не превосходят 1000.

Выходные данные

Выведите ответ на задачу.

Примеры

Ввод Вывод
-1 -2 -3 -4 100 100

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

ОТВЕТ:
a = list(input().split())
m = 1000
for i in range(len(a)):
     s = int(a[i])
     if s < m and s > 0:
          m = s
print(m)



Задача 8

Количество различных элементов

Дан список, упорядоченный по неубыванию элементов в нём. Определите, сколько в нём различных элементов.

Входные данные

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

Выходные данные

Выведите ответ на задачу.

Примеры

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

ОТВЕТ:
a = [int(i) for i in input().split()]
count = 1
for i in range(0, len(a) - 1):
     if a[i] != a[i + 1]:
          count += 1
print(count)



Задача *

Ближайшее число

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

Входные данные

В первой строке содержится список чисел — элементы массива (целые числа, не превосходящие 1000 по абсолютному значению).

Во второй строке вводится одно целое число x, не превосходящее 1000 по абсолютному значению.

Выходные данные

Вывести значение элемента массива, ближайшего к x. Если таких чисел несколько, выведите любое из них.

Примеры

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

Видеоразбор

ОТВЕТ:
a = list(map(int, input().split()))
x = int(input())
ans = a[0]
for elem in a:
     if abs(elem - x) < abs(ans - x):
          ans = elem
print(ans)



Задача *

Шеренга

Петя перешёл в другую школу. На уроке физкультуры ему понадобилось определить своё место в строю. Помогите ему это сделать.

Входные данные

Программа получает на вход невозрастающую последовательность натуральных чисел, означающих рост каждого человека в строю. После этого вводится число X — рост Пети. Все числа во входных данных натуральные и не превышают 200 по значению.

Выходные данные

Выведите номер, под которым Петя должен встать в строй. Если в строю есть люди с одинаковым ростом, таким же, как у Пети, то он должен встать после них.

Примеры

Ввод Вывод
165 163 160 160 157 157 155 154
162
3

Ввод Вывод
165 163 160 160 157 157 155 154
160
5

Видеоразбор

ОТВЕТ:
a = list(map(int, input().split()))
h = int(input())
ans = 1
for i in range(len(a)):
     if a[i] >= h:
          ans = i + 2
print(ans)



Задача *

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

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

Используйте минимально возможное количество операций присваивания. Не используйте кортежные присваивания.

Входные данные

Вводится список чисел. Все числа списка находятся на одной строке.

Выходные данные

Выведите ответ на задачу.

Примеры

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

Видеоразбор

ОТВЕТ:
a = input().split()
last = a[-1]
for i in range(len(a) - 2, -1 , -1):
     a[i + 1] = a[i]
a[0] = last
print(' '.join(a))



Задача *

Два ближайших числа

Дан список целых чисел, содержащий как минимум два элемента. Найдите в нём два ближайших элемента (то есть два элемента с минимальной абсолютной разностью). Изменять список при этом нельзя.

Входные данные

В единственной строке входных данных задан список целых чисел, не превосходящих по модулю 231.

Выходные данные

Программа должна вывести два числа: индексы двух элементов списка, абсолютная величина разности которых минимальна.

Примеры

Ввод Вывод
7 0 4 2 5 9 2 4

Видеоразбор

ОТВЕТ:
a = list(map(int, input().split()))
ans_i = 0
ans_j = 1
for i in range(len(a)):
     for j in range(i + 1, len(a)):
          if abs(a[i] - a[j]) < abs(a[ans_i] - a[ans_j]):
               ans_i = i
               ans_j = j
print(ans_i, ans_j)



Задача *

Медиана

В списке нечётное число элементов, при этом все элементы различны. Найдите медиану списка: элемент, который стоял бы ровно посередине списка, если список отсортировать.

При решении этой задачи нельзя модифицировать данный список (в том числе и сортировать его), использовать вспомогательные списки.

Программа должна вывести единственное число — значение медианного элемента в списке.

Входные данные

Первая строка содержит размер массива N. Во второй строке через пробел задаются N чисел — элементы массива. Гарантируется, что N ⩽ 1000 и N — нечётное число.

Выходные данные

Программа должна вывести одно число — медиану массива.

Примеры

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

Видеоразбор

ОТВЕТ:
n = int(input())
a = list(map(int, input().split()))
for elem in a:
     count = 0
     for x in a:
          if x < elem:
               count += 1
     if count == n // 2:
          print(elem)
          break