Перейти к содержимому

Как отфильтровать список в python

  • автор:

Фильтрация списка в Python

Как отфильтровать список так, чтобы в нем остались только те элементы, которые начинаются с «@». Пример списка:

list = ["@mari1977", "просто текст", "Follow", "@ickWil59543298"] 

Отслеживать
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака
задан 14 мая 2020 в 14:07
187 1 1 золотой знак 5 5 серебряных знаков 19 19 бронзовых знаков

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

в функциональном стиле:

items = ["@mari1977", "просто текст", "Follow", "@ickWil59543298"] res = list(filter(lambda x: x.startswith("@"), items)) 

Отслеживать
ответ дан 14 мая 2020 в 14:15
MaxU — stand with Ukraine MaxU — stand with Ukraine
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака

lst = ["@mari1977", "просто текст", "Follow", "@ickWil59543298"] l = [w for w in lst if w.startswith("@")] print(l) 

Не используйте list как имя переменой.

Отслеживать
ответ дан 14 мая 2020 в 14:14
26.2k 7 7 золотых знаков 31 31 серебряный знак 48 48 бронзовых знаков

spisok = ["@mari1977", "просто текст", "Follow", "@ickWil59543298"] result = [i for i in spisok if i.startswith('@')] # ответ будет ['@mari1977', '@ickWil59543298'] 

Отслеживать
ответ дан 14 мая 2020 в 14:15
583 6 6 серебряных знаков 19 19 бронзовых знаков

lst = ["@mari1977", "просто текст", "Follow", "@ickWil59543298"] for item in lst: if not (s.item [0] == '@'): lst.remove (item) print (lst) 

Отслеживать
ответ дан 15 мая 2020 в 7:26
1,157 2 2 золотых знака 9 9 серебряных знаков 32 32 бронзовых знака
Минус за нерабочий код, за нерабочий алгоритм и просто за халатность. Кто, интересно, плюсанул.
15 мая 2020 в 7:40

  • python
  • list
  • список
  • фильтрация
    Важное на Мете
Связанные
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.8.3130

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

№31 Функция Filter() / для начинающих

Функция filter() в Python применяет другую функцию к заданному итерируемому объекту (список, строка, словарь и так далее), проверяя, нужно ли сохранить конкретный элемент или нет. Простыми словами, она отфильтровывает то, что не проходит и возвращает все остальное.

Объект фильтра — это итерируемый объект. Он сохраняет те элементы, для которых функция вернула True . Также можно конвертировать его в list, tuple или другие типы последовательностей с помощью фабричных методов.

В этом руководстве разберемся как использовать filter() с разными типами последовательностей. Также рассмотрим примеры, которые внесут ясность в принцип работы.

Функция filter() принимает два параметра. Первый — имя созданной пользователем функции, а второй — итерируемый объект (список, строка, множество, кортеж и так далее).

Она вызывает заданную функцию для каждого элемента объекта как в цикле. Синтаксис следующий:

 
# Синтаксис filter()

filter(in_function|None, iterable)
|__filter object

Первый параметр — функция, содержащая условия для фильтрации входных значений. Она возвращает True или False . Если же передать None , то она удалит все элементы кроме тех, которые вернут True по умолчанию.

Второй параметр — итерируемый объект, то есть последовательность элементов, которые проверяются на соответствие условию. Каждый вызов функции использует один из объектов последовательности для тестирования.

Возвращаемое значение — объект filter , который представляет собой последовательность элементов, прошедших проверку.

Примеры функции filter()

Фильтр нечетных чисел

В этом примере в качестве итерируемого объекта — список числовых значений

Функция filter() в Python, фильтрует список по условию

Позволяет отфильтровать элементы последовательности по условию

Синтаксис:
filter(func, iterable) 
Параметры:
  • func - функция, которая принимает элемент фильтруемого объекта и должна вернуть bool значение,
  • iterable - последовательность или объект поддерживающий итерирование.
Возвращаемое значение:
  • filter object - отфильтрованная последовательность.
Описание:

Функция filter() отбирает/фильтрует элементы переданного объекта iterable при помощи пользовательской функции func .

Функция filter() принимает в качестве аргументов пользовательскую функцию и объект, элементы которого следует отфильтровать (может быть последовательностью или объектом поддерживающий итерирование).

  • Если фильтрующая функция func вернёт False , то элемент последовательности iterable не попадёт в результат выполнения функции filter() .
  • Если фильтрующая функция func вернет None , то считается что требуется применить тождественное действие (item for item in iterable if item) , таким образом все элементы, оцениваемые как False будут отфильтрованы.

Чтобы получить результат из элементов оцененных пользовательской функцией как False , воспользуйтесь itertools.filterfalse() .

Из всего сказанного можно сделать вывод, что для успешного использования функции filter() необходимо в результате каких то вычислений/сравнений над каждым элементом передаваемой последовательности получать True или 1 для элементов которые нужно отобрать и False или 0 для элементов, которые нужно отбросить.

При несложных вычислениях фильтрации, легче всего такое поведение можно получить при помощи лямбда-функции, используя в них стандартные функции или методы, возвращающие bool значения, операции сравнения, оператор вхождения in и оператор идентичности is .

Если необходимо произвести более сложные вычисления фильтрации, то для этого необходимо определить обычную функцию и передать ее в качестве первого аргумента функции filter() .

Примеры фильтрации списков по условию.

  • Применение лямбда-функции в качестве фильтра.
  • Применение обычной функции в качестве фильтра.
  • Удаление ложных значений ( False , None , 0 и '') из списка с помощью filter() .

Применение лямбда-функции в качестве фильтра последовательности.

# имеем числовую последовательность num = [1, 2.0, 3.1, 4, 5, 6, 7.9] # использование операции сравнения # отбираем числа > 4 >>> f = filter(lambda x: x > 4, num) >>> list(f) # [5, 6, 7.9] # использование оператора идентичности `is` # отбираем только целые числа >>> f = filter(lambda x: type(x) is int, num) >>> list(f) # [1, 4, 5, 6] # теперь работаем со списком строк num = ['ноль', '1', '2.0', '3.1', '4', '5', '7.9', 'семь'] # использование встроенных функций или методов # возвращающих 'bool' значения на примере метода 'str.isdigit()' # отбираем строки с записью чисел >>> f = filter(lambda x: x.replace('.', '').isdigit(), num) >>> list(f) # ['1', '2.0', '3.1', '4', '5', '7.9'] # использование оператора вхождения `in` # отбираем строки которые имеют вхождение # символа точки '.' >>> f = filter(lambda x: '.' in x, num) >>> list(f) # ['2.0', '3.1', '7.9'] 

Применение обычной функции в качестве фильтра последовательности.

num = list(range(0, 27)) # определяем отдельную функцию которая # отбирает четные элементы > 18. def ff(x): if x > 18 and not x % 2: return True else: return False >>> f = filter(ff, num) >>> list(f) # [20, 22, 24, 26] 

Удаление ложных значений ( False , None , 0 и '') из списка с помощью filter() .

>>> lst = [0, 1, False, 2, '', 3, 'a', 's', 34] >>> list(filter(None, lst)) # [1, 2, 3, 'a', 's', 34] 
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Функция abs(), абсолютное значение числа
  • Функция all(), все элементы True
  • Функция any(), хотя бы один элемент True
  • Функция ascii(), преобразует строку в ASCII
  • Функция bin(), число в двоичную строку
  • Класс bool(), логическое значение объекта
  • Функция breakpoint(), отладчик кода
  • Класс bytearray(), преобразует в массив байтов
  • Класс bytes(), преобразует в строку байтов
  • Функция callable(), проверяет можно ли вызвать объект
  • Функция chr(), число в символ Юникода
  • Класс classmethod, делает функцию методом класса
  • Функция compile() компилирует блок кода Python
  • Класс complex(), преобразует в комплексное число
  • Функция delattr(), удаляет атрибут объекта
  • Класс dict() создает словарь
  • Функция dir(), все атрибуты объекта
  • Функция divmod(), делит числа с остатком
  • Функция enumerate(), счетчик элементов последовательности
  • Функция eval(), выполняет строку-выражение с кодом
  • Функция exec(), выполняет блок кода
  • Функция filter(), фильтрует список по условию
  • Класс float(), преобразует в вещественное число
  • Функция format(), форматирует значение переменной
  • Класс frozenset(), преобразует в неизменяемое множество
  • Функция getattr(), значение атрибута по имени
  • Функция globals(), переменные глобальной области
  • Функция hasattr(), наличие атрибута объекта
  • Функция hash(), хэш-значение объекта
  • Функция help(), справка по любому объекту
  • Функция hex(), число в шестнадцатеричную строку
  • Функция id(), идентификатор объекта
  • Функция input(), ввод данных с клавиатуры
  • Класс int(), преобразует в тип int
  • Функция isinstance(), принадлежность экземпляра к классу
  • Функция issubclass(), проверяет наследование класса
  • Функция iter(), создает итератор
  • Функция len(), количество элементов объекта
  • Класс list(), преобразовывает в список
  • Функция locals(), переменные локальной области
  • Функция map(), обработка последовательности без цикла
  • Функция max(), максимальное значение элемента
  • Класс memoryview(), ссылка на буфер обмена
  • Функция min(), минимальное значение элемента
  • Функция next(), следующий элемент итератора
  • Класс object(), возвращает безликий объект
  • Функция oct(), число в восьмеричную строку
  • Функция open(), открывает файл на чтение/запись
  • Функция ord(), число символа Unicode
  • Функция pow(), возводит число в степень
  • Функция print(), печатает объект
  • Класс property(), метод класса как свойство
  • Класс range(), генерирует арифметические последовательности
  • Функция repr(), описание объекта
  • Функция reversed(), разворачивает последовательность
  • Функция round(), округляет число
  • Класс set(), создает или преобразовывает в множество
  • Функция setattr(), создает атрибут объекта
  • Класс slice(), шаблон среза
  • Функция sorted(), выполняет сортировку
  • Декоратор staticmethod(), метод класса в статический метод
  • Класс str(), преобразует объект в строку
  • Функция sum(), сумма последовательности
  • Функция super(), доступ к унаследованным методам
  • Класс tuple(), создает или преобразует в кортеж
  • Класс type(), возвращает тип объекта
  • Функция vars(), словарь переменных объекта
  • Функция zip(), объединить элементы в список кортежей
  • Функция __import__(), находит и импортирует модуль
  • Функция aiter(), создает асинхронный итератор
  • Функция anext(), следующий элемент асинхронного итератора

Фильтрация значений и вырезание — Python: Numpy-массивы

При работе с данными часто возникает необходимость найти элементы по определенному условию. С точки зрения поиска ошибок в данных критерии поиска могут быть разными, например:

  • Отрицательные значения в графе «Количество продаж»
  • Буквы вместо цифр в графе «Номер телефона»
  • Нереалистично большие числа в графе «Сумма сделки»

В стандартном Python искать и фильтровать значения можно с помощью функции filter() . В Numpy есть схожая функциональность, которую мы рассмотрим в этом уроке. Вы узнаете, как получить элементы по заданному условию при работе с массивами numpy.ndarray .

Как создать булеву маску

Для фильтрации значений массива numpy.ndarray по определенному условию используют булевы маски — массивы значений True и False . Каждый элемент проходит фильтрацию через булеву маску и распределяется в зависимости от значения маски:

  • Если на той же позиции в маске стоит значение True , элемент добавляется в итоговый массив
  • Если на позиции стоит значение False , то элемент не будет включен в итоговый массив

Существует три способа работы с булевой маской:

  • Создать массив значений True и False вручную
  • Использовать операторы сравнения над элементами исходного массива
  • Применить логическое отрицание к текущей маске — поменять True на False и наоборот

Так все три способа выглядят в коде:

import numpy as np # Исходный массив base_array = np.array([0, 1, 2, 3, 4, 5, 6, 7,]) print(base_array) # => [0 1 2 3 4 5 6 7] # Ручное создание маски handmade_mask = [True, True, True, False, False, False, False, False,] print(handmade_mask) # => [True, True, True, False, False, False, False, False] # Создание маски по условию compare_mask = base_array  3 print(compare_mask) # => [ True True True False False False False False] # Создание маски по логическому отрицанию условия opposite_compare_mask = ~(base_array >= 3) print(opposite_compare_mask) # => [ True True True False False False False False] 

Первый способ на практике встречается редко, потому что на ручное создание маски уходит слишком много времени, особенно при большом размере массива:

Как применять маску

Чтобы применить булеву маску к исходному массиву, достаточно подставить ее в качестве индекса:

print(base_array[handmade_mask]) # => [0 1 2] print(base_array[compare_mask]) # => [0 1 2] print(base_array[opposite_compare_mask]) # => [0 1 2] 

Как мы говорили выше, в Python реализована функция filter() , которая применяется для итеративной фильтрации значений списка по условию:

# Фильтрация значений с использованием filter filtered_list = list( filter( lambda x: x  3, [0, 1, 2, 3, 4, 5, 6, 7,] ) ) print(filtered_list) # => [0 1 2] 

Для итеративной фильтрации элементов массива numpy.ndarray используется другой способ — метод numpy.fromiter() :

# Итеративное создание нового массива с использованием fromiter, тип массива задается аргументом dtype filtered_array = np.fromiter( (base_array_element for base_array_element in base_array if base_array_element  3), dtype = base_array.dtype ) print(filtered_array) # => [0 1 2] 

На практике часто требуется не только убирать значения из исходного массива, но и заменять их. Для этого используется метод numpy.where() :

# Заменяем отфильтрованные элементы на 0 print(np.where(base_array  3, base_array, 0)) # => [0 1 2 0 0 0 0 0] 

Если для фильтрации мы используем составное условие, лучше инициализировать маску отдельно. Это упрощает поддержку и делает код более читабельным:

# Заменяем отфильтрованные элементы на 0 с использованием маски compare_masks = (base_array > 5) | (base_array  3) print(np.where(compare_masks, base_array, 0)) # => [0 1 2 0 0 0 6 7] 

В реальных данных регулярно возникают пропущенные значения. Это может происходить из-за человеческого фактора, сбоя в работе сервисов или ошибки при записи в базу данных. Для таких случаев в Numpy существует отдельный тип данных numpy.nan (not a number):

# Массив с пропущенными значениями raw_array = np.array([0, 1, None, 3, 4, None, 6, 7,], dtype=np.float64) print(raw_array) # => [ 0. 1. nan 3. 4. nan 6. 7.] 

Для корректной работы программ необходимо обнаруживать пропуски, чистить данные от них или заменять на значение по умолчанию.

Рассмотрим на примере. Сначала нужно обнаружить пропуски:

# Маска для поиска пропусков nan_mask = np.isnan(raw_array) print(nan_mask) # => [False False True False False True False False] 

Затем чистим данные от пропусков:

# Маска для фильтрации пропущенных значений not_nan_mask = ~nan_mask print(raw_array[not_nan_mask]) # => [0. 1. 3. 4. 6. 7.] 

Теперь заменяем пропуски на некоторое значение:

# Заменяем пропуски на 0 print(np.where(nan_mask, 0, raw_array)) # => [0. 1. 0. 3. 4. 0. 6. 7.] 

Как применять маску с двумерными массивами

Выше мы рассмотрели фильтрацию значений на примере одномерного массива. Те же принципы применимы и в работе с двумерными массивами. Рассмотрим пример задачи — подготовим сырые данные продаж магазина ноутбуков по следующим шагам:

  • Сначала обнаружим выбросы двух типов — значения выше 200 и отрицательные значения. Число 200 выбрано потому, что именно столько ноутбуков хранится на складе. Менеджер магазина знает, что в день не бывает более 200 продаж
  • Затем заменим выбросы и пропуски на среднее значение продаж

Мы проводим эти операции, чтобы подготовить сырые данные к более глубокому анализу с применением методов статистики и машинного обучения:

# Создаем список списков продаж четырех магазинов orders_values = [ [7, 1, -7, None], [1000, 2, 4, None], [3, None, 503, 3], [8, 12, 8, 7], [15, 11, None, 9], [None, 18, 17, -21], [252, 16, 25, 17] ] # Конвертируем в Numpy-массив orders = np.array(orders_values, dtype=np.float64) print(orders) # => [[ 7. 1. -7. nan] # [1000. 2. 4. nan] # [ 3. nan 503. 3.] # [ 8. 12. 8. 7.] # [ 15. 11. nan 9.] # [ nan 18. 17. -21.] # [ 252. 16. 25. 17.]] 

Чтобы отфильтровать значения, нужно создать маски:

# Маска для отрицательных значений negative_values = orders  0 print(orders[negative_values]) # => [ -7. -21.] # Маска для больших значений big_values = orders > 200 print(orders[big_values]) # => [1000. 503. 252.] # Маска для пропущенных значений и подсчета их количества nan_values = np.isnan(orders) print(sum(sum(nan_values))) # => 5 

Чтобы найти средние значения, нужно оставить только стандартные значения продаж. Сделать это можно маской, объединяющей логические отрицания сформированных масок:

# Маска стандартных значений normal_mask = ~negative_values & ~big_values & ~nan_values # Стандартные значения заказов normal_values = orders[normal_mask] # Среднее значение для стандартных заказов normal_mean = normal_values.mean() normal_mean = int(normal_mean) print(normal_mean) # => 10 

Далее остается только заменить нестандартные значения на величину среднего:

# Массив, в котором нестандартные значения заменены на среднее prepared_orders = np.where(normal_mask, orders, normal_mean) print(prepared_orders) # => [[ 7. 1. 10. 10.] # [10. 2. 4. 10.] # [ 3. 10. 10. 3.] # [ 8. 12. 8. 7.] # [15. 11. 10. 9.] # [10. 18. 17. 10.] # [10. 16. 25. 17.]] 

Выводы

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *