• 1
    Ввод и вывод данных
    • Задачи
  • 2
    Условия
    • Задачи
  • 3
    Цикл for
    • Задачи
  • 4
    Строки
    • Задачи
  • 5
    Цикл while
    • Задачи
  • 6
    Списки
    • Задачи
  • 7
    Двумерные массивы
    • Задачи
  • 8
    Словари
    • Задачи
  • 9
    Множества
    • Задачи
  • 10
    Функции и рекурсия
    • Задачи
  • к

Занятие 6. Списки

Уровень сложности:

иконка человека красный иконка человека белая иконка человека зеленая Pythonlib

Задача«Любимые пиццы»

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

Формат ввода

Список названий пицц (каждое название вводится с новой строки, ввод заканчивается словом "СТОП").
Название пиццы, количество заказов которой нужно посчитать

Формат Вывода

Количество заказов указанной пиццы

Пример

Ввод

Маргарита
Пепперони
Маргарита
Гавайская
Маргарита
СТОП
Маргарита

Вывод

3

Подсказка

Преобразование строки в список чисел в питоне

В Python можно создать список из строки несколькими способами, в зависимости от формата исходной строки. Чаще всего в задачах встречается строка чисел, разделенных пробелом.

Способ 1: Генератор списка (List Comprehension)

Это самый распространенный и "пайтонический" (Pythonic) способ. Он читаемый и быстрый.

# Исходная строка
input_string = "1 2 3 4 5"

# Шаг 1: Разделение строки на подстроки по пробелу
string_list = input_string.split()
# Результат: ['1', '2', '3', '4', '5']

# Шаг 2: Преобразование каждой подстроки в целое число
int_list = [int(num) for num in string_list]
print(int_list)  # Вывод: [1, 2, 3, 4, 5]

# Конечно, эти два шага почти всегда объединяют в одну строку для краткости:
int_list_oneline = [int(num) for num in input_string.split()]
print(int_list_oneline) # Вывод: [1, 2, 3, 4, 5]

Полезный совет: Метод .split() очень гибкий. Если числа в строке разделены не пробелом, а, например, запятой, просто передайте этот разделитель в качестве аргумента: input_string.split(','). Если вы вызовете .split() без аргументов, он разделит строку по любым пробельным символам (пробелы, табы, переносы строк) и удалит пустые строки, что очень удобно для "грязных" данных.

Способ 2: Использование функции map()

Функция map() применяет указанную функцию (в нашем случае int) к каждому элементу последовательности (в нашем случае к списку, который вернул .split()). Это может быть немного быстрее для очень больших объемов данных, но часто считается менее читаемым, чем генератор списка.

# Исходная строка
input_string = "1 2 3 4 5"

# Разделение строки и преобразование с использованием map
# map() возвращает специальный объект-итератор, а не список
map_object = map(int, input_string.split())

# Чтобы получить список, нужно явно преобразовать этот объект
int_list = list(map_object)

print(int_list)  # Вывод: [1, 2, 3, 4, 5]

Краткое пояснение функций:

  • input_string.split(): Превращает строку в список подстрок. "1 2 3" станет ['1', '2', '3'].
  • map(function, iterable): Применяет function к каждому элементу iterable. map(int, ['1', '2', '3']) последовательно выполнит int('1'), int('2'), int('3').
  • list(iterable): Преобразует итерируемый объект (например, результат map) в полноценный список.

Основные методы списков

Списки в Python — это изменяемые структуры данных с множеством полезных методов.

numbers = [1, 4, 5, 6, 7, 4, 3, 2]

# .index(value): возвращает индекс первого вхождения элемента.
# Если элемента нет в списке, произойдет ошибка ValueError!
index_of_4 = numbers.index(4)
print(f"Индекс первой четверки: {index_of_4}")  # Вывод: Индекс первой четверки: 1

# .count(value): возвращает количество вхождений элемента.
count_of_4 = numbers.count(4)
print(f"Количество четверок: {count_of_4}")  # Вывод: Количество четверок: 2

# .sort(): сортирует список "на месте" (in-place), то есть изменяет сам список.
# Ничего не возвращает (точнее, возвращает None).
numbers.sort()
print(f"Отсортированный список: {numbers}")  # Вывод: Отсортированный список: [1, 2, 3, 4, 4, 5, 6, 7]
# Для сортировки по убыванию используйте аргумент reverse=True
numbers.sort(reverse=True)
print(f"Отсортированный по убыванию: {numbers}") # Вывод: Отсортированный по убыванию: [7, 6, 5, 4, 4, 3, 2, 1]


# .reverse(): переворачивает список "на месте".
numbers.reverse()
print(f"Перевернутый список: {numbers}")  # Вывод: Перевернутый список: [1, 2, 3, 4, 4, 5, 6, 7]

# .copy(): создает поверхностную копию списка.
# Это важно, когда вы хотите изменить копию, не затрагивая оригинал.
numbers_copy = numbers.copy()
print(f"Копия списка: {numbers_copy}")  # Вывод: Копия списка: [1, 2, 3, 4, 4, 5, 6, 7]

Важно: Не путайте метод .sort() и встроенную функцию sorted().

  • my_list.sort() изменяет my_list.
  • new_list = sorted(my_list) создает новый отсортированный список new_list, а my_list остается без изменений. Это предпочтительнее, если вам нужно сохранить исходный порядок.

Удаление элементов из списка

numbers = [1, 10, 2, 3, 4, 5, 6, 7]

# .remove(value): удаляет первый найденный элемент с указанным значением.
# Если такого элемента нет, будет ошибка ValueError.
numbers.remove(10)
print(numbers)  # Вывод: [1, 2, 3, 4, 5, 6, 7]

# .pop([index]): удаляет элемент по индексу и возвращает его.
# Если индекс не указан, удаляет и возвращает последний элемент.
# Это очень удобно для реализации структур данных вроде стека.
last_element = numbers.pop() # Удаляем последний элемент
print(f"Удаленный элемент: {last_element}") # Вывод: Удаленный элемент: 7
print(numbers)  # Вывод: [1, 2, 3, 4, 5, 6]
element_at_index_2 = numbers.pop(2) # Удаляем элемент с индексом 2
print(f"Удаленный элемент: {element_at_index_2}") # Вывод: Удаленный элемент: 3
print(numbers) # Вывод: [1, 2, 4, 5, 6]

# Оператор del: удаляет элемент по индексу или целый срез.
del numbers[1] # Удаляем элемент с индексом 1
print(numbers)  # Вывод: [1, 4, 5, 6]

# Удаление нескольких элементов с помощью среза
del numbers[1:3] # Удаляем элементы с индекса 1 по 3 (не включая 3)
print(numbers)  # Вывод: [1, 6]

Совет: Чтобы полностью очистить список, используйте метод .clear() (numbers.clear()) или присваивание пустого среза (numbers[:] = []). Это эффективнее, чем удалять элементы по одному в цикле.

Генераторы списков (List Comprehensions)

Это мощный инструмент для создания списков на основе других последовательностей. Общая структура: [выражение for элемент in последовательность if условие].

# Создание списка квадратов чисел от 0 до 9
squares = [x**2 for x in range(10)]
print(squares)  # Вывод: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# Создание списка только из четных чисел (фильтрация)
evens = [x for x in range(10) if x % 2 == 0]
print(evens)  # Вывод: [0, 2, 4, 6, 8]

# Создание списка из пользовательского ввода
# Цикл выполнится 3 раза, каждый раз запрашивая ввод и добавляя его в список
# user_inputs = [input("Введите значение: ") for _ in range(3)]
# print(user_inputs)

# Использование тернарного оператора (if/else) для преобразования элементов
# Заменить нечетные числа на 0, а четные оставить как есть
numbers = [1, 2, 3, 4, 5, 6]
transformed_list = [x if x % 2 == 0 else 0 for x in numbers]
print(transformed_list) # Вывод: [0, 2, 0, 4, 0, 6]

# Комбинация фильтрации и преобразования
# Взять числа больше 5, и если они четные - оставить, если нечетные - заменить на 0.
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filtered_numbers = [x if x % 2 == 0 else 0 for x in numbers if x > 5]
print(filtered_numbers)  # Вывод: [6, 0, 8, 0, 10]

Запомните синтаксис:

  • Если вам нужно просто отфильтровать элементы, if ставится в конце: [x for x in data if x > 5]
  • Если вам нужно преобразовать каждый элемент на основе условия, конструкция if/else ставится в начале: [x*2 if x > 5 else x for x in data]

Функция zip()

Функция zip() "сшивает" несколько списков в одну последовательность пар (кортежей). Это невероятно удобно для параллельной обработки данных.

names = ["Даниил", "Светлана", "Валя"]
scores = [4, 6, 8]
for name, score in zip(names, scores):
	print(f"У {name} результат {score}")

# Вывод:
# У Даниил результат 4
# У Светлана результат 6
# У Валя результат 8

Важно: Функция zip() останавливается, как только закончится самый короткий из переданных списков.

names = ["Анна", "Борис", "Виктор"]
ages = [25, 30]
for name, age in zip(names, ages):
    print(name, age) # "Виктор" не будет выведен, так как список ages короче

# Вывод:
# Анна 25
# Борис 30
main.py
Тест 1
Тест 2
Тест 3
Тест 4
Тест 5
Тест 6
Тест 7
Тест 8
Тест 9
Тест 10
Решение разработчика
# Создаем пустой список для хранения заказов пиццы
заказы = []

# Считываем заказы до слова "СТОП"
while True:
    пицца = input()  # Считываем название пиццы
    if пицца == "СТОП":  # Если ввели "СТОП", выходим из цикла
        break
    заказы.append(пицца)  # Добавляем название пиццы в список

# Считываем название пиццы, которую нужно посчитать
искомая_пицца = input()

# Считаем, сколько раз искомая пицца встречается в списке заказов
количество = 0  # Инициализируем счетчик
for пицца in заказы:  # Перебираем все элементы в списке заказов
    if пицца == искомая_пицца:  # Если текущая пицца равна искомой
        количество += 1  # Увеличиваем счетчик

# Выводим количество заказов искомой пиццы
print(количество)

🎉 Поздравляем! 🎉

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

AD

Реклама

red-snake blue-snake green-snake

Запускаем ваш код...

Помощник ИИ

Привет! Я твой помощник по программированию. Задавай любые вопросы по Python, я могу рассказать о функциях, методах, обьяснить то, что тебе не понятно, а так же о текущей задаче!