Python · Синтаксис · Начальный уровень
Методы списков и кортежей
Освойте все методы списков и разберитесь в ключевых отличиях между списками и кортежами.
Краткое введение в тему и пояснения перед упражнениями (упражнения ниже):
Кортежи и распаковка
#Справочник: методы списков и кортежей
#Упражнения:
append vs extend
#У вас есть список `result = [1, 2, 3]`. Напишите два отдельных выражения: 1. Используйте `append`, чтобы добавить список `[4, 5]` как один элемент. 2. Начиная заново от `[1, 2, 3]`, используйте `extend`, чтобы добавить `[4, 5]` как отдельные элементы. Выведите оба результата и объясните разницу.
result = [1, 2, 3] # 1. Используйте append, чтобы добавить [4, 5] как ОДИН элемент # 2. Начните заново и используйте extend, чтобы добавить [4, 5] как ОТДЕЛЬНЫЕ элементы result2 = [1, 2, 3]
Решение
result = [1, 2, 3]
result.append([4, 5])
print(result) # [1, 2, 3, [4, 5]] — вложенный список
result2 = [1, 2, 3]
result2.extend([4, 5])
print(result2) # [1, 2, 3, 4, 5] — отдельные элементы
Вставка на позицию
#Напишите функцию `insert_after(lst, target, value)`, которая вставляет `value` сразу после первого вхождения `target` в `lst`. Если `target` не найден, добавьте `value` в конец. Пример: `insert_after([1, 2, 4, 5], 2, 3)` → `[1, 2, 3, 4, 5]`.
def insert_after(lst, target, value):
pass
print(insert_after([1, 2, 4, 5], 2, 3)) # [1, 2, 3, 4, 5]
print(insert_after([1, 2, 3], 99, 0)) # [1, 2, 3, 0]
Решение
def insert_after(lst, target, value):
result = lst[:]
if target in result:
idx = result.index(target)
result.insert(idx + 1, value)
else:
result.append(value)
return result
print(insert_after([1, 2, 4, 5], 2, 3)) # [1, 2, 3, 4, 5]
print(insert_after([1, 2, 3], 99, 0)) # [1, 2, 3, 0]
Удалить дубликаты (с сохранением порядка)
#Напишите функцию `remove_dupes(lst)`, которая удаляет дубликаты из списка, сохраняя порядок первого появления элементов. Пример: `remove_dupes([3, 1, 2, 1, 3, 4])` → `[3, 1, 2, 4]`. Не используйте множества напрямую (они не сохраняют порядок).
def remove_dupes(lst):
pass
print(remove_dupes([3, 1, 2, 1, 3, 4])) # [3, 1, 2, 4]
print(remove_dupes([1, 1, 1])) # [1]
Решение
def remove_dupes(lst):
seen = set()
result = []
for item in lst:
if item not in seen:
seen.add(item)
result.append(item)
return result
print(remove_dupes([3, 1, 2, 1, 3, 4])) # [3, 1, 2, 4]
print(remove_dupes([1, 1, 1])) # [1]
Сортировка по ключу
#Напишите функцию `sort_by_length(words)`, которая возвращает новый список слов, отсортированных по длине (сначала самые короткие). Слова одинаковой длины должны сохранять относительный порядок. Пример: `sort_by_length(["banana", "fig", "apple", "kiwi"])` → `["fig", "kiwi", "apple", "banana"]`.
def sort_by_length(words):
pass
print(sort_by_length(["banana", "fig", "apple", "kiwi"]))
# ["fig", "kiwi", "apple", "banana"]
Решение
def sort_by_length(words):
return sorted(words, key=len)
print(sort_by_length(["banana", "fig", "apple", "kiwi"]))
# ["fig", "kiwi", "apple", "banana"]
Стек на основе списка
#Реализуйте простой стек на основе списка. Напишите класс `Stack` с методами: `push(item)`, `pop()` (возвращает и удаляет верхний элемент), `peek()` (возвращает верхний элемент без удаления), `is_empty()`, `size()`. Используйте только методы списка — импорт не нужен.
class Stack:
def __init__(self):
self._data = []
def push(self, item):
pass
def pop(self):
pass
def peek(self):
pass
def is_empty(self):
pass
def size(self):
pass
s = Stack()
s.push(1)
s.push(2)
s.push(3)
print(s.peek()) # 3
print(s.pop()) # 3
print(s.size()) # 2
print(s.is_empty()) # False
Решение
class Stack:
def __init__(self):
self._data = []
def push(self, item):
self._data.append(item)
def pop(self):
return self._data.pop()
def peek(self):
return self._data[-1]
def is_empty(self):
return len(self._data) == 0
def size(self):
return len(self._data)
s = Stack()
s.push(1)
s.push(2)
s.push(3)
print(s.peek()) # 3
print(s.pop()) # 3
print(s.size()) # 2
print(s.is_empty()) # False
Безопасная копия
#Следующий код содержит ошибку. Исправьте его так, чтобы изменение `b` не влияло на `a`: ```python a = [1, 2, 3] b = a b.append(99) print(a) # должен остаться [1, 2, 3] ``` Объясните в комментарии, почему исходный код не работает.
a = [1, 2, 3] b = a # ОШИБКА: оба указывают на один список b.append(99) print(a) # должно быть [1, 2, 3], но выводит [1, 2, 3, 99] # Исправьте код выше чтобы изменение b не влияло на a
Решение
a = [1, 2, 3]
b = a.copy() # создаёт новый независимый список
b.append(99)
print(a) # [1, 2, 3] — без изменений
print(b) # [1, 2, 3, 99]
# Альтернативы: b = a[:] или b = list(a)
Распаковка кортежей
#Напишите функцию `swap(a, b)`, которая возвращает два значения в обратном порядке, используя распаковку кортежа в одну строку. Затем напишите функцию `unpack_first_last(lst)`, которая возвращает кортеж `(first, last)` с помощью звёздочной распаковки. Пример: `unpack_first_last([10, 20, 30, 40])` → `(10, 40)`.
def swap(a, b):
pass
def unpack_first_last(lst):
pass
print(swap(1, 2)) # (2, 1)
print(unpack_first_last([10, 20, 30, 40])) # (10, 40)
Решение
def swap(a, b):
return b, a
def unpack_first_last(lst):
first, *_, last = lst
return first, last
print(swap(1, 2)) # (2, 1)
print(unpack_first_last([10, 20, 30, 40])) # (10, 40)
Безопасный поиск индекса
#Напишите функцию `find_index(lst, value)`, которая возвращает индекс `value` в `lst`, или `-1` если не найден. НЕ используйте `.index()` напрямую (он кидает ValueError). Пример: `find_index([10, 20, 30], 20)` → `1`, `find_index([10, 20, 30], 99)` → `-1`.
def find_index(lst, value):
pass
print(find_index([10, 20, 30], 20)) # 1
print(find_index([10, 20, 30], 99)) # -1
Решение
def find_index(lst, value):
try:
return lst.index(value)
except ValueError:
return -1
print(find_index([10, 20, 30], 20)) # 1
print(find_index([10, 20, 30], 99)) # -1
Самый частый элемент
#Напишите функцию `most_frequent(lst)`, которая возвращает элемент, встречающийся чаще всего в списке. При равенстве — возвращайте тот, что появился первым. Пример: `most_frequent([1, 2, 2, 3, 1, 2])` → `2`, `most_frequent([5, 5, 3, 3])` → `5`.
def most_frequent(lst):
pass
print(most_frequent([1, 2, 2, 3, 1, 2])) # 2
print(most_frequent([5, 5, 3, 3])) # 5 (первый при равенстве)
Решение
def most_frequent(lst):
counts = {}
for item in lst:
counts[item] = counts.get(item, 0) + 1
return max(lst, key=lambda x: counts[x])
print(most_frequent([1, 2, 2, 3, 1, 2])) # 2
print(most_frequent([5, 5, 3, 3])) # 5 (первый при равенстве)
Выровнять на один уровень
#Напишите функцию `flatten(lst)`, которая принимает список списков и возвращает один плоский список со всеми элементами. Пример: `flatten([[1, 2], [3, 4], [5]])` → `[1, 2, 3, 4, 5]`. Используйте `extend` или генератор списка.
def flatten(lst):
pass
print(flatten([[1, 2], [3, 4], [5]])) # [1, 2, 3, 4, 5]
print(flatten([[10, 20], [30], [40, 50]])) # [10, 20, 30, 40, 50]
Решение
def flatten(lst):
result = []
for sub in lst:
result.extend(sub)
return result
# Однострочный вариант:
def flatten_v2(lst):
return [x for sub in lst for x in sub]
print(flatten([[1, 2], [3, 4], [5]])) # [1, 2, 3, 4, 5]
print(flatten([[10, 20], [30], [40, 50]])) # [10, 20, 30, 40, 50]