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

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

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

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

Задача«Редкие артефакты»

Археолог-стажер Петя проводит раскопки на древнем городище. Он находит различные артефакты, каждому из которых присвоен идентификационный номер. Петя записывает номера всех найденных артефактов в том порядке, в котором он их нашел. Теперь его научный руководитель попросил его составить список редких артефактов — тех, которые за все время раскопок встретились только один раз. Помогите Пете отфильтровать список и показать только номера редких находок, сохранив при этом исходный порядок их обнаружения.

Формат ввода

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

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

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

Пример

Ввод

10 20 30 20 10 40 50

Вывод

30 40 50

Подсказка

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

В 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
Решение разработчика
# Ввод: одна строка с идентификаторами артефактов, разделёнными пробелами
s = input().strip()

# Разделяем строку на элементы и преобразуем к целым числам
# Если строка пустая, split() вернет пустой список
nums = list(map(int, s.split())) if s else []

# Подсчитываем частоты каждого числа
freq = {}
for x in nums:
    freq[x] = freq.get(x, 0) + 1

# Формируем результат: элементы, встретившиеся ровно один раз,
# в том же порядке, в каком они впервые появились в исходном списке.
unique_once = []
seen = set()  # чтобы не добавлять повторно повторяющиеся элементы
for x in nums:
    if freq[x] == 1 and x not in seen:
        unique_once.append(str(x))
        seen.add(x)

# Вывод: через пробел. Если уникальных нет — выведем пустую строку.
print(" ".join(unique_once))

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

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

AD

Реклама

red-snake blue-snake green-snake

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

Помощник ИИ

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