Практические задания по программированию на языке 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))

Этот подход позволяет обрабатывать файлы любого размера.

Уроки и задачи по Python - comments

En
уроки и задачи python (python)