Практические задания по программированию на языке Python
Основные подходы к обработке списков в Python
При изучении Python важно решать практические задачи. Одна из распространенных - удаление дублирующихся элементов из списка. Рассмотрим несколько решений с разными целями.
Как сохранить исходный порядок элементов, убрав повторения?
Основной способ - использование dict.fromkeys(). Начиная с Python 3.7 словари сохраняют порядок вставки, поэтому этот метод создает словарь с уникальными ключами, а затем преобразуется обратно в список.
numbers = [1, 2, 3, 2, 4, 1, 5, 3]
unique = list(dict.fromkeys(numbers))
print(unique) # [1, 2, 3, 4, 5]
задачи python pdf (задачи по python в формате pdf)
Типичные ошибки:
- Забыть преобразовать dict_keys обратно в список (list()).
- Использовать для элементов, которые не могут быть ключами словаря (например, списки). В таком случае потребуется другой подход.
- Полагаться на порядок в версиях Python младше 3.7 - в них порядок не гарантирован, лучше использовать OrderedDict.
Как получить уникальные элементы, если порядок не важен?
Самый простой способ - преобразовать список во множество (set). Это удаляет все дубликаты за линейное время, но порядок не сохраняется.
unique = list(set(numbers))
print(unique) # например, [1, 2, 3, 4, 5] (порядок может быть другим)
уроки и задачи python (уроки и задачи по python)
Ошибки: предполагать, что set вернет элементы в исходном порядке. Для проверки на уникальность без сохранения порядка это подходит, но если порядок важен, следует использовать другие методы.
Как удалить дубликаты вручную с помощью цикла?
Этот метод сохраняет порядок и работает с любыми элементами, включая нехэшируемые. Однако временная сложность O(n^2) делает его медленным на больших списках.
unique = []
for item in numbers:
if item not in unique:
unique.append(item)
print(unique) # [1, 2, 3, 4, 5]
Проблемы: при каждом добавлении проверка "item not in unique" имеет линейную сложность, что приводит к квадратичному времени. Для маленьких списков (до нескольких сотен элементов) это допустимо, для больших - лучше использовать set или dict.fromkeys.
Как обеспечить сохранение порядка в старых версиях Python?
Если используется Python 2.7 или 3.0-3.6, словари не гарантируют порядок. В этом случае применяется collections.OrderedDict.
from collections import OrderedDict
unique = list(OrderedDict.fromkeys(numbers))
print(unique) # [1, 2, 3, 4, 5]
Замечание: в современных версиях (3.7+) можно обойтись без импорта, но для совместимости со старыми интерпретаторами OrderedDict остается надежным решением.
Выбор метода зависит от конкретной задачи: если порядок не важен - set, если важен и список небольшой - цикл, если важен и список большой - dict.fromkeys или OrderedDict.
Подсчет частоты слов в тексте
Еще одна часто встречающаяся задача - подсчет, сколько раз каждое слово встречается в тексте. Рассмотрим несколько продвинутых подходов.
Как подсчитать слова в строке с использованием словаря?
Базовый метод: разбить строку по пробелам и увеличивать счетчик для каждого слова.
text = "python python java python c++ java"
words = text.split()
freq = {}
for word in words:
freq[word] = freq.get(word, 0) + 1
print(freq)
{'python': 3, 'java': 2, 'c++': 1}
Этот способ прост, но не обрабатывает знаки препинания и регистр.
Как упростить код с помощью defaultdict?
Модуль collections предоставляет defaultdict, который автоматически инициализирует отсутствующие ключи значением по умолчанию.
from collections import defaultdict
freq = defaultdict(int)
for word in words:
freq[word] += 1
print(dict(freq))
{'python': 3, 'java': 2, 'c++': 1}
Этот вариант короче и понятнее, избегает вызова get.
Как использовать Counter из collections?
Counter - это специализированный словарь для подсчета частоты. Он предоставляет дополнительные методы, например, most_common.
from collections import Counter
freq = Counter(words)
print(freq)
print("Топ 2:", freq.most_common(2))
Counter({'python': 3, 'java': 2, 'c++': 1})
Топ 2: [('python', 3), ('java', 2)]
Counter - это самый удобный способ, когда требуется частотный анализ.
Как обработать текст со знаками препинания и разным регистром?
Для реального текста необходимо очистить слова от знаков препинания и привести к нижнему регистру. Используем регулярные выражения.
import re
from collections import Counter
text = "Python! python? Java, c++ java. Python"
cleaned = re.findall(r'\b\w+\b', text.lower())
freq = Counter(cleaned)
print(freq)
Counter({'python': 3, 'java': 2, 'c++': 1})
Регулярное выражение \b\w+\b находит последовательности буквенно-цифровых символов (слова). Приведение к нижнему регистру обеспечивает учет слов независимо от регистра.
Для работы с большими файлами рекомендуется читать построчно и обновлять Counter поэтапно, чтобы не загружать весь текст в память.
from collections import Counter
import re
counter = Counter()
with open('large_text.txt', 'r', encoding='utf-8') as f:
for line in f:
words = re.findall(r'\b\w+\b', line.lower())
counter.update(words)
print(counter.most_common(10))
Этот подход позволяет обрабатывать файлы любого размера.