Фильтрация списка в Python: как найти элементы по заданному правилу
Главный способ: list comprehension
Как получить новый список из элементов, которые удовлетворяют определённому условию?
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
even_numbers = [n for n in numbers if n % 2 == 0]
print(even_numbers)Python list element (получение элемента списка в python)
[2, 4, 6, 8]
Python add to list (добавление элемента в список)
List comprehension (списковое включение) создаёт новый список, проходя по исходному и оставляя только те элементы, для которых условие истинно. Это компактная и быстрая конструкция, предпочтительная в большинстве случаев.
Типичные ошибки: путаница порядка записи - сначала выражение, потом цикл, потом условие. Забывание оператора if приводит к включению всех элементов. Для сложных условий рекомендуется выносить логику в функцию.
Вариант 1. Функция filter()
Как отфильтровать список без создания промежуточного списка в явном виде?
numbers = [1, 2, 3, 4, 5, 6]
odd_numbers = list(filter(lambda x: x % 2 != 0, numbers))
print(odd_numbers)
Python copy list (копирование списка в python)
[1, 3, 5]
Python list extend (метод extend для списка)
filter() принимает функцию и итерируемый объект, возвращает итератор с элементами, для которых функция вернула True. Для получения списка потребуется явное преобразование list().
Проблема: функция filter() без list() даёт итератор, который можно обойти только один раз. Лямбда-функция не всегда читаема для сложных условий.
Цель: экономия памяти при работе с большими данными, если нужен итератор, а не список.
Вариант 2. Цикл for с ручным добавлением
Как отфильтровать список без использования специальных конструкций?
numbers = [1, 2, 3, 4, 5, 6]
result = []
for n in numbers:
if n > 3:
result.append(n)
print(result)Python list reverse (реверс списка в python)
[4, 5, 6]
Python empty list (создание пустого списка)
Классический цикл for с накоплением результата в пустом списке. Даёт полный контроль над процессом, можно добавлять отладочный вывод или вложенную логику.
Ошибки: модификация списка во время итерации (удаление элементов) может пропускать элементы. Лучше не менять исходный список.
Случаи использования: когда условие содержит побочные эффекты (вывод, запись) или требуется несколько этапов обработки.
Вариант 3. Генератор с next() для поиска первого элемента
Как найти только первый элемент, удовлетворяющий условию, без обработки всего списка?
numbers = [10, 20, 30, 40, 50]
first_large = next((n for n in numbers if n > 25), None)
print(first_large)Python list slice (срезы списков в python)
30
Python filter list (фильтрация списка с помощью filter)
Генераторное выражение вычисляется лениво. next() извлекает первое значение; если совпадения нет, возвращается значение по умолчанию (None).
Проблема: без значения по умолчанию при отсутствии элемента возникнет исключение StopIteration. Следует всегда указывать второй аргумент next().
Применение: когда важен только один результат (например, первая запись в журнале, соответствующая ошибке).
Вариант 4. Поиск индексов элементов по условию
Как получить позиции (индексы) элементов, для которых выполняется условие?
numbers = [5, 10, 15, 20, 25]
indices = [i for i, v in enumerate(numbers) if v > 15]
print(indices)Python list function (функции для работы со списками)
[3, 4]
Python добавить элемент в массив (добавление элемента в конец списка (append) в python)
Функция enumerate() даёт пары (индекс, значение). С помощью list comprehension отбираются нужные индексы.
Ошибка: путаница порядка распаковки кортежа: сначала индекс, потом значение. Если написать for v, i, индексы будут получены неверно.
Когда используется: для дальнейшей модификации элементов по их позиции или для извлечения данных из нескольких списков одинаковой длины.
Вариант 5. Использование operator.attrgetter для списка объектов
Как отфильтровать список пользовательских объектов по значению атрибута?
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
people = [Person('Anna', 25), Person('Bob', 30), Person('Eve', 20)]
adults = [p for p in people if p.age >= 18]
for p in adults:
print(p.name, p.age)элемент двумерного массива python (доступ к элементу двумерного массива (списка списков) в python)
Anna 25 Bob 30 Eve 20
Условие обращается к атрибутам объекта напрямую. Альтернативно можно применить filter() с лямбдой или с operator.attrgetter, но list comprehension остаётся самым наглядным.
Подводный камень: если атрибут отсутствует, возникнет AttributeError. Стоит использовать getattr(p, 'age', None) или проверять через hasattr.
Дополнительные примеры с расширенными сценариями поиска элементов.
Пример 1. Фильтрация по нескольким условиям (логические операторы)
data = [12, 5, 8, 21, 15, 3, 18]
# Элементы больше 10 и чётные
result = [x for x in data if x > 10 and x % 2 == 0]
print(result)
[12, 18]
Пример 2. Поиск в списке строк по подстроке (регистронезависимый)
fruits = ['Apple', 'banana', 'apricot', 'Cherry', 'avocado']
# Все фрукты, начинающиеся с 'a' или 'A'
selected = [f for f in fruits if f.lower().startswith('a')]
print(selected)
['Apple', 'apricot', 'avocado']
Пример 3. Использование filter() с именованной функцией
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
numbers = list(range(1, 21))
primes = list(filter(is_prime, numbers))
print(primes)
[2, 3, 5, 7, 11, 13, 17, 19]
Пример 4. Поиск всех индексов с одновременным преобразованием значений
words = ['cat', 'dog', 'elephant', 'tiger']
# Индексы и длина слов, длина которых > 3
result = [(i, len(w)) for i, w in enumerate(words) if len(w) > 3]
print(result)
[(2, 8), (3, 5)]
Пример 5. Комбинация map и filter (функциональный подход)
values = [1, -2, 3, -4, 5]
# Сначала отфильтровать только положительные, потом возвести в квадрат
# filter с map, но удобнее list comprehension
positive_squares = list(map(lambda x: x**2, filter(lambda x: x > 0, values)))
print(positive_squares)
[1, 9, 25]
Примечание: list comprehension [x**2 for x in values if x > 0] делает то же самое проще и быстрее.
Пример 6. Поиск уникальных элементов с сохранением порядка (условие 'не был ранее')
items = [1, 2, 2, 3, 1, 4, 3]
seen = set()
unique = [x for x in items if not (x in seen or seen.add(x))]
print(unique)
[1, 2, 3, 4]
Здесь используется побочный эффект set.add() для запоминания уже встреченных элементов. Данный трюк требует осторожности, так как изменяет внешнюю переменную seen.
Пример 7. Вложенные list comprehension для фильтрации вложенных списков
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# Выбрать все чётные элементы из всех строк
evens = [x for row in matrix for x in row if x % 2 == 0]
print(evens)
[2, 4, 6, 8]
Пример 8. Использование next() с генератором для поиска первого слова определённой длины
sentences = ['кратко', 'многословное предложение', 'ещё одна фраза']
first_long = next((s for s in sentences if len(s) > 10), 'Нет длинных')
print(first_long)
многословное предложение
Для случаев, когда требуется не просто отфильтровать, но и преобразовать данные, list comprehension остаётся наиболее универсальным и читаемым инструментом. Функция filter() полезна в функциональных цепочках, а генераторы с next() - для экономии времени при поиске первого совпадения.