Фильтрация списка в 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 студентов
Наши выпускники работают в компаниях: