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

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

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

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

Задача«Слияние списков»

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

Формат ввода

Количество сортов фруктов (целое число).
Количество яблок каждого сорта на первом складе (целые числа, разделенные пробелами).
Количество груш каждого сорта на втором складе (целые числа, разделенные пробелами)

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

Общее количество фруктов каждого сорта (целые числа, разделенные пробелами)

Пример

Ввод

3
10 20 30
5 15 25

Вывод

15 35 55

Подсказка

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

В 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
Решение разработчика
# Считываем количество сортов фруктов
n = int(input())

# Считываем количество яблок каждого сорта
apples = list(map(int, input().split()))

# Считываем количество груш каждого сорта
pears = list(map(int, input().split()))

# Используем zip для объединения списков и суммирования значений
total_fruits = [a + p for a, p in zip(apples, pears)]

# Выводим результат
print(*total_fruits)

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

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

AD

Реклама

red-snake blue-snake green-snake

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

Помощник ИИ

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