Рубрики
Без рубрики

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

Как вы можете отфильтровать список в Python, используя произвольное состояние? Наиболее Pythonic и Sightance Way – использовать понимание списка [X для X в списке, если состояние] для фильтрации всех элементов из списка. https://youtu.be/3ng4tlkqzf8 Фильтр с пониманием списка Наиболее пифитонный способ фильтрации списка – на мой взгляд — это список … Как отфильтровать список в Python? Прочитайте больше “

Автор оригинала: Chris.

Как вы можете отфильтровать список в Python, используя произвольное состояние? Самый питон и самый исполнительный способ – использовать понимание списка [X для X в списке, если состояние] Чтобы отфильтровать все элементы из списка.

Фильтр с пониманием списка

Самый питонический способ фильтрации списка – на мой взгляд – это заявление о понимании списка [X для X в списке, если состояние] Отказ Вы можете заменить условие с любой функцией х Вы хотели бы использовать в качестве состояния фильтрации.

Например, если вы хотите отфильтровать все элементы, которые меньше, скажем, 10, вы бы использовали оператор понимания списка [X для X в списке, если X <10] Чтобы создать новый список со всеми элементами списка, которые меньше 10.

Вот три примера фильтрации списка:

  • Получить элементы меньше восьми: [X для X в LST, если X <8] Отказ
  • Получить даже элементы: [X для X в LST, если] Отказ
  • Получить нечетные элементы: [X для X в LST, если x% 2] Отказ
lst = [8, 2, 6, 4, 3, 1]

# Filter all elements <8
small = [x for x in lst if x<8]
print(small)


# Filter all even elements
even = [x for x in lst if x%2==0]
print(even)

# Filter all odd elements
odd = [x for x in lst if x%2]
print(odd)

Вывод:

# Elements <8
[2, 6, 4, 3, 1]

# Even Elements
[8, 2, 6, 4]

# Odd Elements
[3, 1]

Это самый эффективный способ фильтрации списка, и это также самый питон один. Если вы ищете альтернативы, хотя, продолжайте читать, потому что я объясню вам каждый нюанс списков фильтрации в Python в этом всеобъемлющем руководстве.

Фильтр списка Python с фильтром ()

Фильтр (функция, утечка) Функция принимает функцию в качестве ввода, которая принимает аргумент (элемент списка) и возвращает логическое значение, должен ли этот элемент списка передавать фильтр. Все элементы, которые проходят фильтр, возвращаются как новый ИТЕРИТЕЛЬНО объект (объект фильтра).

Вы можете использовать лямбда Заявление о функциях для создания функции вправо, где вы передаете его как аргумент. Синтаксис функции лямбда – это лямбда x: выражение, и это означает, что вы используете X в качестве аргумента ввода, и вы возвращаете выражение в результате (это может или не может использовать X, чтобы определиться с возвратом). Для получения дополнительной информации см. Мой Подробная статья в блоге о функции лямбда Отказ

lst = [8, 2, 6, 4, 3, 1]

# Filter all elements <8
small = filter(lambda x: x<8, lst)
print(list(small))


# Filter all even elements
even = filter(lambda x: x%2==0, lst)
print(list(even))

# Filter all odd elements
odd = filter(lambda x: x%2, lst)
print(list(odd))

Вывод:

# Elements <8
[2, 6, 4, 3, 1]

# Even Elements
[8, 2, 6, 4]

# Odd Elements
[3, 1]

Фильтр () Функция возвращает объект фильтра, который ИТЕРИТЕЛЬНО Отказ Чтобы преобразовать его в список, вы используете Список (...) конструктор.

Связанная статья:

  • Как фильтровать с помощью функции лямбда

Фильтр списка Python с картой ()

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

Вот что я имею в виду:

lst = [8, 2, 6, 4, 3, 1]

# Filter all elements <8
small = list(map(lambda x: x if x<8 else None, lst))
small = [x for x in small if x!=None]
print(small)


# Filter all even elements
even = list(map(lambda x: x if x%2==0 else None, lst))
even = [x for x in even if x!=None]
print(even)


# Filter all odd elements
odd = list(map(lambda x: x if x%2 else None, lst))
odd = [x for x in odd if x!=None]
print(odd)

Выход снова одинаково:

[2, 6, 4, 3, 1]
[8, 2, 6, 4]
[3, 1]

Но метод получения этого выхода явно неэффективна и нечитается.

Статьи по Теме:

  • Как избавиться от карты () функции (и почему руководство ненавидело его)

Генератор списка фильтра Python

Выражение генератора создает итератор по последовательности значений. Он работает так же, как список пометки – но без создания типа данных списка. Это немного более эффективно.

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

  • Сначала определите ИТЕРИТЕЛЬНО ценностей, которые соответствуют определенным условиям.
  • Во-вторых, сумма над всеми этими значениями, используя сумма () функция.

Вот пример кода, который показывает, как суммировать все целочисленные значения в списке (и игнорирование остальных) с использованием выражения генератора для отфильтровывания этих неистеваний:

lst = [6, 8, 2, 8, 'Alice']
print(sum(x for x in lst if type(x) == int))
# 24

Вы проверяете Тип (х) каждого элемента и сравните его против целочисленного типа. Это сравнение возвращает Правда Если элемент, на самом деле, типа целого числа.

Список фильтров Python с условием

Вы можете определить все сложные условия в элементе списка, чтобы решить, следует ли выфильтировать его или нет. Просто создайте свою собственную функцию (E.g., Условие (x) ), который принимает один элемент списка в качестве ввода и возвращает логическое значение Правда Если условие будет выполнено или Ложь иначе.

Вот пример кода:

def condition(x):
    '''Define your arbitrarily
    complicated condition here'''

    return x<10 and x>0

lst = [11, 14, 3, 0, -1, -3]

# Filter out all elements that do
# not meet condition
filtered = [x for x in lst if condition(x)]
print(filtered)
# [3]

Все элементы, которые меньше 10 и больше, чем 0, включены в отфильтрованный список. Таким образом, только один элемент 3 остается.

Фильтр Python Список нескольких условий

То же самое относится же, если вы хотите объединить несколько условий. Скажем, вы хотите отфильтровать все элементы X> 9 и X <1. Это два (простых) условия. Вы можете определить все сложные условия в элементе списка, чтобы решить, следует ли выфильтировать его или нет. Для этого создайте функцию (E.g., Условие (x) ), которая принимает один элемент списка в качестве ввода и возвращает логическое значение Правда Если условие будет выполнено или Ложь иначе.

Вот тот же пример кода, что и раньше:

def condition(x):
    '''Define your arbitrarily
    complicated condition here'''

    return x<10 and x>0

lst = [11, 14, 3, 0, -1, -3]

# Filter out all elements that do
# not meet condition
filtered = [x for x in lst if condition(x)]
print(filtered)
# [3]

Все элементы, которые меньше 10 и больше, чем 0, включены в отфильтрованный список. Таким образом, только один элемент 3 остается.

Список фильтра Python с Regex

Проблема : Учитывая список строк. Как вы можете отфильтровать те, которые соответствуют определенным регулярное выражение ?

Пример : Скажи, у вас есть список [«Алиса», «Анна», «Энн», «Том»] И вы хотите отфильтровать те элементы, которые не соответствуют шаблону Regex 'A. * E' Отказ Вы ожидаете, что фильтрованный список будет [«Алиса», «Анна»] Отказ

Решение : Используйте каркас фильтрации понимания списка [x для x в списке, если совпадение] Чтобы отфильтровать все элементы, которые не соответствуют данной строке.

import re

# Define the list and the regex pattern to match
customers = ['Alice', 'Anne', 'Ann', 'Tom']
pattern = 'A.*e'

# Filter out all elements that match the pattern
filtered = [x for x in customers if re.match(pattern, x)]

print(filtered)
# ['Alice', 'Anne']

Вы используете Re.match () Метод, который возвращает объект матча, если есть совпадение или нет иначе. В Python любой объект Match оценивает true (если необходимо) отдельно от некоторых исключений (например, Нет , 0 , 0.0 и т. Д.). Если вам нужно обновить ваше основное понимание Re.match () Функция, проверьте мой подробный Статья в блоге Это приводит вас к шагу за шагом в этот мощный инструмент Python.

Статьи по Теме:

  • Как считать элементы в списке, соответствующее условию
  • Как сопоставить точное слово в Python
  • Как подсчитать количество матчей в Python

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

Краткий ответ: Чтобы отфильтровать список списков для условия на внутренних списках, используйте оператор понимания списка [X для X в списке, если условие (X)] и заменить Состояние (x) с вашим условием фильтрации, которое возвращает Истинный включить внутренний список x , и Ложь иначе.

Списки относятся к наиболее важным структурам данных в Python – каждый мастер-кодер знает их наизусть! Удивительно, что даже промежуточные кодеры не знают лучших способов фильтрации списка – один список списков в Python. В этом руководстве показано, как сделать последнее!

Проблема : Скажем, у вас есть список списков. Вы хотите отфильтровать список списков, чтобы оставаться только те внутренние списки, которые удовлетворяют определенному условию. Условие – это функция внутреннего списка, такая как средняя или сумма элементов внутреннего списка.

Пример : Учитывая следующий список списков с еженедельными измерениями температуры в неделю и один внутренний список в неделю.

# Measurements of a temperature sensor (7 per week)
temperature = [[10, 8, 9, 12, 13, 7, 8], # week 1
               [9, 9, 5, 6, 6, 9, 11], # week 2
               [10, 8, 8, 5, 6, 3, 1]] # week 3

Как отфильтровать более холодные недели со средним значением температуры <8? Это выпуск вы желаете:

print(cold_weeks)
# [[9, 9, 5, 6, 6, 9, 11], [10, 8, 8, 5, 6, 3, 1]]

Существует два семантически эквивалентных методах для достижения этого: понимание списка и функции карты (). Давайте исследуем обе варианты в нашем интерактивном коде раковину:

Статьи по Теме:

  • Как отфильтровать список списков Python?
  • Список понимания – список списков Python
  • Фильтр () VS Появление списка
  • Вложенный список понимание
  • Окончательное руководство по спискам Python
  • Список понимания

Фильтр Python Список строк

Проблема : Учитывая список строк и строку запроса. Как вы можете отфильтровать те, которые содержат строку запроса?

Пример : Скажи, у вас есть список [«Алиса», «Анна», «Энн», «Том»] И вы хотите получить все элементы, которые содержат подстроку 'A' Отказ Вы ожидаете, что фильтрованный список будет ['Anne', 'an'] Отказ

Решение : Используйте каркас фильтрации понимания списка [X для X в списке, если состояние] Чтобы отфильтровать все элементы, которые не содержат другая строка.

import re

# Define the list
customers = ['Alice', 'Anne', 'Ann', 'Tom']

# Filter out all elements that contain 'An'
filtered = [x for x in customers if 'An' in x]

print(filtered)
# ['Anne', 'Ann']

Вы используете основную операцию членства строки «в», чтобы проверить, проходит ли элемент фильтра или нет.

Список фильтра Python удалить пустую строку

Проблема : Учитывая список строк. Как вы можете удалить все пустые строки?

Пример : Скажи, у вас есть список [«Алиса», «Анна», «,« Энн »,«, «Том»] И вы хотите получить новый список [«Алиса», «Анна», «Энн», «Том»] непустых струн.

Решение : Используйте каркас фильтрации понимания списка [X для X в списке, если x] отфильтровывать все пустые строки.

import re

# Define the list
customers = ['Alice', 'Anne', '', 'Ann', '', 'Tom']

# Filter out all elements that contain 'An'
filtered = [x for x in customers if x]

print(filtered)
# ['Alice', 'Anne', 'Ann', 'Tom']

Вы используете свойство, которую Python назначает логическое значение «Ложь» к пустой строке '' Отказ

Список фильтра Python Endscith () и Startswith ()

Проблема : Учитывая список строк. Как вы можете отфильтровать те, которые начинаются с другой строки (или заканчиваются другой строкой)? Другими словами, вы хотите получить все строки, которые имеют другую строку как префикс или суффикс.

Пример : Скажи, у вас есть список [«Алиса», «Анна», «Энн», «Том»] И вы хотите получить все элементы, начинающиеся с 'A' Отказ Вы ожидаете, что фильтрованный список будет ['Anne', 'an'] Отказ

Решение : Используйте каркас фильтрации понимания списка [x для x в списке, если x.cstartswith ('an')] Чтобы отфильтровать все элементы, которые начинается с 'A' Отказ Если вы хотите проверить строки, которые заканчиваются другой строкой, вы можете использовать str.endswith () функция вместо этого.

import re

# Define the list
customers = ['Alice', 'Anne', 'Ann', 'Tom']

# Filter out all elements that start with 'An'
filtered = [x for x in customers if x.startswith('An')]

print(filtered)
# ['Anne', 'Ann']


# Filter out all elements that end with 'e'
filtered = [x for x in customers if x.endswith('e')]

print(filtered)
# ['Alice', 'Anne']

Вы используете StartSwith () и Эндонсвит () функционирует как условия фильтрации.

Список фильтра Python с лямбда

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

Чтобы определить эту функцию, вы можете использовать ключевое слово Lambda. Функция лямбда – это анонимная функция – просто подумайте об этом как об этом в качестве функции выброса, которая нужна только в качестве аргумента, так и для ничего другого в коде.

Вот код, который показывает, как отфильтровать список, используя функцию лямбда для фильтрации списка и возврата только нечетных значений в списке:

# Create the list
lst = [1, 2, 3, 4]

# Get all odd values
print(list(filter(lambda x: x%2, lst)))
# [1, 3]

Лямбда функция лямбда х: х% 2 принимает один аргумент х – элемент для проверки на фильтре и возвращает результат выражения х% 2 Отказ Это выражение модуля возвращает 1, если целое число нечетное и 0, если это даже. Таким образом, все нечетные элементы передают тест.

Список фильтра Python с другим списком

Проблема : Учитывая список значений lst и список логических веществ Фильтр Отказ Как отфильтровать первый список, используя второй список? Точнее, вы хотите создать новый список, который включает в себя Я -ный элемент lst Если Я -ный элемент фильтра это Правда Отказ

Пример : Вот два примерных списка:

lst = [1, 2, 3, 4]
filter_lst = [True, False, False, True]

И вы хотите получить этот список:

[1, 4]

Решение : Используйте простое утверждение понимания списка [lst [i] для i в диапазоне (len (lst)), если filter_lst [i]] который проверяет каждый индекс, я должен ли соответствующий фильтр логическое значение Правда Отказ В этом случае вы добавляете элемент при индексе Я в lst в новый фильтрованный список. Вот код:

lst = [1, 2, 3, 4]
filter_lst = [True, False, False, True]

res = [lst[i] for i in range(len(lst)) if filter_lst[i]]
print(res)
# [1, 4]

Логический список служит «маской», которая определяет, какой элемент проходит фильтр и что нет.

Альтернатива – использовать zip () Функция для повторения нескольких последовательностей без необходимости прикоснуться к любому индексу:

lst = [1, 2, 3, 4]
filter_lst = [True, False, False, True]

res = [x for (x, boo) in zip(lst, filter_lst) if boo]
print(res)
# [1, 4]

Вам нужно почистить свой zip () понимание? Проверьте нашу углубленную статью в блоге!

Список фильтра Python с индексом

Проблема : Учитывая список значений и список индексов. Как отфильтровать все элементы с индексами во втором списке?

Пример : Вы перечислите [«Алиса», «Боб», «Энн», «Фрэнк»] и индексы [1, 2] Отказ Вы ищете фильтрованный список [«Боб», «Энн»] Отказ

Решение : Перейдите по всем показателям во втором списке и включите соответствующие элементы списка, используя простое утверждение понимания списка [LST [I] для I в индексах] Отказ

lst = ['Alice', 'Bob', 'Ann', 'Frank']
indices = [1, 2]

res = [lst[i] for i in indices]
print(res)
# ['Bob', 'Ann']

Только два элемента с индексами 1 и 2 проходят фильтр.

Фильтр Python Список словарей

Проблема : Учитывая список словарей. Каждый словарь состоит из одного или нескольких (ключевых, значение) пар. Вы хотите отфильтровать их по значению определенного словаря ключа ( атрибут ). Как ты это делаешь?

Минимальный пример : Рассмотрим следующий пример, где у вас три пользовательских словаря с Имя пользователя , возраст и play_time Ключи. Вы хотите получить список всех пользователей, которые соответствуют определенным условиям, таким как Play_time> 100 Отказ Вот что вы пытаетесь сделать:

users = [{'username': 'alice', 'age': 23, 'play_time': 101},
         {'username': 'bob', 'age': 31, 'play_time': 88},
         {'username': 'ann', 'age': 25, 'play_time': 121},]

superplayers = # Filtering Magic Here

print(superplayers)

Выход должен выглядеть так, где play_time Атрибут определяет, проходит ли словарь фильтровать или нет, то есть Play_time> 100 :

[{'username': 'alice', 'age': 23, 'play_time': 101},
 {'username': 'ann', 'age': 25, 'play_time': 121}]

Решение : Используйте Понимание списка [x для x в lst, если условие (x)] Чтобы создать новый список словарей, которые соответствуют условию. Все словари в lst которые не соответствуют состоянию отфильтровывают. Вы можете определить ваше собственное состояние в элементе списка х Отказ

Вот код, который показывает, как отфильтровать все пользовательские словари, которые не соответствуют условию сыграли не менее 100 часов.

users = [{'username': 'alice', 'age': 23, 'play_time': 101},
         {'username': 'bob', 'age': 31, 'play_time': 88},
         {'username': 'ann', 'age': 25, 'play_time': 121},]

superplayers = [user for user in users if user['play_time']>100]

print(superplayers)

Выходной вывод является отфильтрованным списком словарей, соответствующих условию:

[{'username': 'alice', 'age': 23, 'play_time': 101},
 {'username': 'ann', 'age': 25, 'play_time': 121}]

Попробуй сам:

Сопутствующие статьи на блоге Finxter:

  • Как отфильтровать список словарей
  • Список понимания
  • Лямбда функции
  • Словари

Список фильтра Python Уникальный – Удалить дубликаты

Как удалить все дубликаты данного значения в списке?

Наивный подход – пройти каждый элемент и проверять, существует ли этот элемент в списке. Если это так, удалите его. Однако это требует нескольких строк кода.

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

В качестве значений словаря вы просто принимаете фиктивные значения (по умолчанию).

Связанные статьи в блоге:

  • Проверьте мой Ultimate Tutorial Tutorial для максимального обучения!

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

Вот код:

>>> lst = [1, 1, 1, 3, 2, 5, 5, 2]
>>> dic = dict.fromkeys(lst)
>>> dic
{1: None, 3: None, 2: None, 5: None}
>>> duplicate_free = list(dic)
>>> duplicate_free
[1, 3, 2, 5]

Диапазон списка фильтра Python

Фильтруйте все элементы в списке, который попадает в диапазон значений между заданным Начать и Стоп Индексы.

lst = [3, 10, 3, 2, 5, 1, 11]
start, stop = 2, 9

filtered_lst = [x for x in lst if x>=start and x<=stop]
print(filtered_lst)
# [3, 3, 2, 5]

Вы используете состояние x> = запуск и Чтобы проверить, ли список элементов х падает в диапазон [Начать, остановить] или нет.

Список фильтров Python больше, чем и меньше, чем

Фильтруйте все элементы в списке, которые превышают данное значение y.

lst = [3, 10, 3, 2, 5, 1, 11]
y = 2

filtered_lst = [x for x in lst if x>y]
print(filtered_lst)
# [3, 10, 3, 5, 11]

Вы используете состояние x> y Чтобы проверить, элемент списка х больше чем y или нет. В первом случае он включен в отфильтрованный список. В последнем случае это не так.

Вы можете использовать ту же идею с менее чем оператор < через заявление о понимании списка [X для X в LST, если X Отказ

Список списка фильтра Python

Как вы можете подсчитать элементы при определенном состоянии в Python? Например, что, если вы хотите посчитать все четные значения в списке? Или все простые номера? Или все строки, которые начинаются с определенного персонажа? Есть несколько способов выполнить это, давайте обсудим их один за другим.

Скажем, у вас есть условие для каждого элемента х Отказ Давайте сделаем это функцией с именем Состояние (x) Отказ Вы можете определить любое условие, которое вы хотите, просто положите его в свою функцию. Например, это условие возвращает true для всех элементов, которые больше, чем целое число 10:

def condition(x):
    return x > 10


print(condition(10))
# False

print(condition(2))
# False

print(condition(11))
# True

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

Список Python считай, если

Как вы можете посчитать элементы списка, если условие будет выполнено?

Ответ должен использовать простой выражение генератора сумма (условие (x) для x в lst) :

>>> def condition(x):
	return x>10

>>> lst = [10, 11, 42, 1, 2, 3]
>>> sum(condition(x) for x in lst)
2

Результат указывает на то, что есть два элемента, которые больше 10. Вы использовали выражение генератора, которое возвращает итератор логии. Обратите внимание, что логический Правда представлено целочисленным значением 1 и логией Ложь Представляется целочисленным значением 0. Вот почему вы можете просто рассчитать сумму по всем лоянам, чтобы получить количество элементов, для которых удерживается состояние.

Список Python считается больше/меньше

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

>>> def condition(x):
	return x>10

>>> lst = [10, 11, 42, 1, 2, 3]
>>> sum(condition(x) for x in lst)
2

Например, чтобы найти количество элементов, меньше 5, используйте условие X <5 в выражении генератора:

>>> lst = [10, 11, 42, 1, 2, 3]
>>> sum(x<5 for x in lst)
3

Список Python Count Zero/ненулевой

Чтобы подсчитать количество нулей в данном списке, используйте list.Count (0) Способ вызова.

Чтобы подсчитать количество нешен в данном списке, вы должны использовать Условный подсчет Как обсуждалось ранее:

def condition(x):
    return x!=0

lst = [10, 11, 42, 1, 2, 0, 0, 0]
print(sum(condition(x) for x in lst))
# 5

Список Python Count Lambda + карта

Альтернативой состоит в том, чтобы использовать комбинацию карты и функции лямбда.

Статьи по Теме:

  • [Полное руководство] Функция карты : Манипулирует каждый элемент в итерателе.
  • [Полное учебное пособие] Функция лямбда Создает анонимную функцию.

Вот код:

>>> sum(map(lambda x: x%2==0, [1, 2, 3, 4, 5]))
2

Вы считаете количество даже целых чисел в списке.

  • Функция лямбда возвращает значение правды для данного элемента х Отказ
  • Функция карты преобразует каждый элемент списка в логическое значение (1 или 0).
  • Функция суммы суммирует «1».

Результатом является количество элементов, для которых условие оценивается на Правда Отказ

Список фильтров Python по длине строки

Учитывая список строк. Как получить все элементы, которые имеют более х символов? Другими словами: как отфильтровать список по длине строки?

coders = ['Ann', 'Alice', 'Frank', 'Pit']
filtered = [x for x in coders if len(x)>3]
print(filtered)
# ['Alice', 'Frank']

Заявление о понимании списка [x для x в кодерах, если len (x)> 3] Фильтрует все строки, которые имеют более трех персонажей.

Список фильтров Python None

Как удалить все значения из списка? Например, у вас есть список [«Алиса», нет, «Энн», никто, никто, «Боб»] И вы хотите список [«Алиса», «Энн», «Боб»] Отказ Как ты это делаешь?

coders = ['Alice', None, 'Ann', None, None, 'Bob']
filtered = [x for x in coders if x]
print(filtered)
# ['Alice', 'Ann', 'Bob']

В Python каждый элемент имеет соответствующее логическое значение, поэтому вы можете использовать любой объект Python в качестве условия. Ценность Нет связано с логическим значением Ложь Отказ

Python Filter Json List

Проблема : Скажем, у вас есть объект списка JSON. Вы хотите отфильтровать список на основе атрибута. Как сделать это?

Пример : Учитывая следующий список JSON.

json = [
    {
        "user": "alice",
        "type": "free"
    },
    {
        "user": "ann",
        "type": "paid"
    },
    {
        "user": "bob",
        "type": "paid"
    }
]

Вы хотите найти всех пользователей, которые имеют «платный» тип аккаунта:

[
    {
        "user": "ann",
        "type": "paid"
    },
    {
        "user": "bob",
        "type": "paid"
    }
]

Решение : Используйте список пониманий [X для х в JSON, если] Чтобы отфильтровать список и получить новый список JSON с объектами, которые проходят фильтр.

json = [
    {
        "user": "alice",
        "type": "free"
    },
    {
        "user": "ann",
        "type": "paid"
    },
    {
        "user": "bob",
        "type": "paid"
    }
]

filtered = [x for x in json if x['type']=='paid']
print(filtered)
# [{'user': 'ann', 'type': 'paid'},
#  {'user': 'bob', 'type': 'paid'}]

Только Анн и Боб имеет платный аккаунт и пройти тест X [«Тип»] == «Платный» Отказ

Python Filter список одна строка

Хотите отфильтровать свой список данным состоянием в одной строке кода? Используйте заявление об понимании списка [X для X в списке, если состояние] где часть условия может быть любое логическое выражение на x Отказ Этот одноклассник возвращает новый объект списка со всеми элементами, которые проходят фильтрующие «тест».

Вот пример:

lst = ['Alice', 3, 5, 'Bob', 10]

# ONE-LINER:
f = [x for x in lst if type(x)==str]

print(f)
# ['Alice', 'Bob']

Одноклассные фильтруют все элементы в списке и проверяют, имеют ли они типа строки. Если они есть, они проходят тест и включены в новый список.

Если вам нравятся одноклассники, вам понравится мой Python One-Liner Книга (Nostarch Press 2020) Отказ Он точно показывает, как написать код Pythonic и сжимайте свое мышление и кодирование в самую минималистичную форму.

Список фильтра Python эффективно: Filter () VS Появление списка

[SPOILER], который быстрее отфильтровать список: FILTER () VS Появление списка? Для крупных списков с одним миллионным элементами фильтрация списков со списком на 40% быстрее, чем встроенный фильтр() метод.

Чтобы ответить на это Вопрос:| Я написал короткий скрипт, который проверяет производительность выполнения фильтрации крупных списков увеличения размеров с использованием Фильтр () и методы понимания списка.

Мой тезис состоит в том, что метод понимания списка должен быть немного быстрее для размеров более широкого списка, поскольку оно использует эффективную реализацию CPYPHON из списка и не нужно вызывать дополнительную функцию.

Я использовал свою ноутбук с процессором INTEL (R) CORE (TM) I7-8565U 1,8 ГГц (с Turbo Boost до 4,6 ГГц) и 8 ГБ ОЗУ.

Затем я создал 100 списков с обоими способами с размерами, начиная от 10 000 элементов до 1000 000 элементов. В качестве элементов я просто увеличил целочисленные числа на один, начиная с 0.

Вот код, который я использовал для измерения и сюжета результатов: какой метод быстрее – Фильтр () или список пометков?

import time


# Compare runtime of both methods
list_sizes = [i * 10000 for i in range(100)]
filter_runtimes = []
list_comp_runtimes = []

for size in list_sizes:

    lst = list(range(size))
    
    # Get time stamps
    time_0 = time.time()
    list(filter(lambda x: x%2, lst))
    time_1 = time.time()
    [x for x in lst if x%2]
    time_2 = time.time()

    # Calculate runtimes
    filter_runtimes.append((size, time_1 - time_0))
    list_comp_runtimes.append((size, time_2 - time_1))


# Plot everything
import matplotlib.pyplot as plt
import numpy as np

f_r = np.array(filter_runtimes)
l_r = np.array(list_comp_runtimes)

print(filter_runtimes)
print(list_comp_runtimes)

plt.plot(f_r[:,0], f_r[:,1], label='filter()')
plt.plot(l_r[:,0], l_r[:,1], label='list comprehension')

plt.xlabel('list size')
plt.ylabel('runtime (seconds)')

plt.legend()
plt.savefig('filter_list_comp.jpg')
plt.show()

Код сравнивает runtimes of Фильтр () Функция и вариант понимания списка для фильтрации списка. Обратите внимание, что Фильтр () Функция Возвращает объект фильтра, поэтому вам нужно преобразовать его в список, используя Список () конструктор.

Вот полученный график, который сравнивает время выполнения двух методов. На оси X вы можете увидеть размер списка от 0 до 1 000 000 элементов. На оси Y вы можете увидеть время выполнения в секундах, необходимых для выполнения соответствующих функций.

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

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

Для крупных списков с одним миллионным элементами фильтрация списков со списком на 40% быстрее, чем встроенный фильтр() метод.

Причина является эффективной реализацией заявления о понимании списка. Интересное наблюдение – это следующее. Если вы не преобразуете функцию фильтра в список, вы получаете следующий результат:

Внезапно Фильтр () Функция имеет постоянную среду выполнения близко к 0 секунд – независимо от того, сколько элементов в списке. Почему это происходит?

Объяснение простое: Функция фильтра возвращает iTerator, а не список. Итератор не должен вычислять один элемент до тех пор, пока он не будет запрашивать для вычисления Далее () элемент. Итак, Фильтр () Функция вычисляет следующий элемент только в том случае, если это необходимо для этого. Только если вы преобразуете его в список, он должен вычислять все значения. В противном случае это на самом деле не вычисляет одно значение заранее.

Куда пойти отсюда

Этот учебник показал вам и ауты фильтр() Функция в Python и сравнивала его против списка Понимание способа фильтрации: [X для X в списке, если состояние] Отказ Вы видели, что последнее не только более читаемое, так и больше пифитон, но и быстрее. Так что возьмите подход к пониманию списка к фильтрующим спискам!

Если вы любите кодирование, и вы хотите сделать это полный рабочий день с комфорта вашего собственного дома, вам повезло:

Я создал бесплатный вебинар, который показывает вам, как я начал как Фрилансер Python после того, как мои науки, работающие из дома (и видишь, как мои дети растут), зарабатывая на полный рабочий день, работающий только неполный рабочий день.

Вебинар: Как стать шестью фигуры Python Freelancer?

Присоединяйтесь к 21,419 амбициозных кодеров Python. Это весело! 😄🐍.

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.