""" Урок 26. Методы списков — весь код примеров одним файлом. Источник: subjects/python-fundamentals/course/lessons/26-list-methods/examples.html Файл собран автоматически (tools/build_lesson_examples.py): правьте страницу урока. Запуск: python lesson-26.py """ # ==================================================================== # Пример 1. append(), extend(), insert() — три способа что-то добавить # ==================================================================== numbers = [1, 2, 3] numbers.append(4) print(numbers) # [1, 2, 3, 4] numbers.extend([5, 6]) print(numbers) # [1, 2, 3, 4, 5, 6] numbers.insert(1, "new") print(numbers) # [1, 'new', 2, 3, 4, 5, 6] nested = [1, 2, 3] nested.append([4, 5]) print(nested) # [1, 2, 3, [4, 5]] # ==================================================================== # Пример 2. Ловушка: append() вместо extend() на практике # ==================================================================== orders = [("apple", 3), ("banana", 5)] new_orders = [("cherry", 2), ("date", 7)] # неправильно: append кладёт весь список одним элементом wrong = list(orders) wrong.append(new_orders) print(wrong) # [('apple', 3), ('banana', 5), [('cherry', 2), ('date', 7)]] print(len(wrong)) # 3 — а не 4! # правильно: extend добавляет элементы по одному right = list(orders) right.extend(new_orders) print(right) # [('apple', 3), ('banana', 5), ('cherry', 2), ('date', 7)] print(len(right)) # 4 # ==================================================================== # Пример 3. insert() с отрицательным и «слишком большим» индексом # ==================================================================== letters = ["a", "b", "c", "d"] letters.insert(-1, "X") print(letters) # ['a', 'b', 'c', 'X', 'd'] — перед последним элементом letters.insert(100, "END") print(letters) # ['a', 'b', 'c', 'X', 'd', 'END'] — индекс > len -> в конец letters.insert(-100, "START") print(letters) # ['START', 'a', 'b', 'c', 'X', 'd', 'END'] — индекс < -len -> в начало # ==================================================================== # Пример 4. remove(), pop(), clear() — что удаляется и что возвращается # ==================================================================== fruits = ["apple", "banana", "cherry", "banana"] fruits.remove("banana") print(fruits) # ['apple', 'cherry', 'banana'] last_fruit = fruits.pop() print(last_fruit) # banana print(fruits) # ['apple', 'cherry'] try: fruits.remove("kiwi") except ValueError as error: print("ValueError:", error) # ValueError: list.remove(x): x not in list fruits.clear() print(fruits) # [] # ==================================================================== # Пример 5. remove() vs pop() vs del vs срез — четыре способа убрать элемент # ==================================================================== source = ["a", "b", "c", "d", "e"] by_remove = list(source) by_remove.remove("c") print(by_remove) # ['a', 'b', 'd', 'e'] — по значению by_pop = list(source) removed = by_pop.pop(2) print(by_pop, removed) # ['a', 'b', 'd', 'e'] c — по индексу, элемент возвращается by_del = list(source) del by_del[2] print(by_del) # ['a', 'b', 'd', 'e'] — по индексу, ничего не возвращает by_slice = list(source) tail = by_slice[3:] print(tail) # ['d', 'e'] — срез создаёт НОВЫЙ список print(by_slice) # ['a', 'b', 'c', 'd', 'e'] — оригинал не тронут # ==================================================================== # Пример 6. index() и count() — поиск и подсчёт # ==================================================================== fruits = ["apple", "banana", "cherry", "banana", "cherry"] print(fruits.index("banana")) # 1 print(fruits.index("banana", 2)) # 3 — поиск начиная с индекса 2 print(fruits.count("cherry")) # 2 print(fruits.count("orange")) # 0 — count не падает на отсутствующем значении try: fruits.index("kiwi") except ValueError as error: print("ValueError:", error) # ValueError: 'kiwi' is not in list # ==================================================================== # Пример 7. sort() меняет список на месте, sorted() — нет: почему это важно # ==================================================================== def top_three(items): # sorted() не трогает items вызывающего кода return sorted(items, reverse=True)[:3] scores = [4, 9, 1, 7, 3] best = top_three(scores) print(best) # [9, 7, 4] print(scores) # [4, 9, 1, 7, 3] — исходный список не изменился numbers = [4, 1, 7, 2, 9] numbers.sort() print(numbers) # [1, 2, 4, 7, 9] result = numbers.sort() print(result) # None — sort() ничего не возвращает # ==================================================================== # Пример 8. key= для сортировки: строки без учёта регистра, словари, кортежи # ==================================================================== words = ["Banana", "apple", "kiwi", "Cherry"] print(sorted(words)) # ['Banana', 'Cherry', 'apple', 'kiwi'] — по Unicode print(sorted(words, key=str.lower)) # ['apple', 'Banana', 'Cherry', 'kiwi'] — без учёта регистра prices = {"apple": 120, "banana": 45, "cherry": 300} print(sorted(prices.items(), key=lambda item: item[1])) # [('banana', 45), ('apple', 120), ('cherry', 300)] people = [("Alice", 25), ("Bob", 20), ("Carol", 30)] print(sorted(people, key=lambda person: person[1])) # [('Bob', 20), ('Alice', 25), ('Carol', 30)] # ==================================================================== # Пример 9. Устойчивость сортировки и сортировка по нескольким ключам # ==================================================================== students = [("Bob", 4), ("Alice", 5), ("Ann", 4), ("Zoe", 5)] by_grade = sorted(students, key=lambda s: s[1], reverse=True) print(by_grade) # [('Alice', 5), ('Zoe', 5), ('Bob', 4), ('Ann', 4)] # внутри одинаковой оценки порядок из исходного списка сохранён orders = [("banana", 2, 45), ("apple", 1, 120), ("apple", 3, 120), ("banana", 1, 45)] by_name_then_qty = sorted(orders, key=lambda o: (o[0], -o[1])) print(by_name_then_qty) # [('apple', 3, 120), ('apple', 1, 120), ('banana', 2, 45), ('banana', 1, 45)] # сначала по названию, внутри одного названия — по количеству по убыванию # ==================================================================== # Пример 10. min(), max() с key= и default= # ==================================================================== words = ["apple", "banana", "kiwi", "grape"] print(min(words, key=len)) # kiwi print(max(words, key=len)) # banana empty = [] print(min(empty, default="список пуст")) # список пуст try: min(empty) except ValueError as error: print("ValueError:", error) # ValueError: min() arg is an empty sequence tuples = [(3, 6), (1, 7, 9), (12, 5), (1, 3, 7)] tuples.sort(key=max, reverse=True) print(tuples) # [(12, 5), (1, 7, 9), (1, 3, 7), (3, 6)] # ==================================================================== # Пример 11. sum() со start и ограничение по типам # ==================================================================== scores = [4, 1, 7, 2, 9] print(sum(scores)) # 23 print(sum(scores, 1000)) # 1023 — start прибавляется к сумме prices = (19.99, 5.50, 2.25) print(sum(prices)) # 27.74 — sum() работает и с кортежами try: sum(["a", "b", "c"]) except TypeError as error: print("TypeError:", error) # TypeError: unsupported operand type(s) for +: 'int' and 'str' # ==================================================================== # Пример 12. reversed() как итератор и способы скопировать список # ==================================================================== letters = "Python" reversed_obj = reversed(letters) print(reversed_obj) # print("".join(reversed_obj)) # nohtyP numbers = [1, 2, 3, 4] print(list(reversed(numbers))) # [4, 3, 2, 1] print(numbers) # [1, 2, 3, 4] — оригинал не тронут original = [1, 2, 3] copy_a = original.copy() copy_b = original[:] copy_a.append(4) copy_b.append(5) print(original) # [1, 2, 3] — независим от копий print(copy_a) # [1, 2, 3, 4] print(copy_b) # [1, 2, 3, 5]