Каков самый Pythonic способ фильтрации набора?

У меня есть список, состоящий из замен, и я хочу сделать две вещи:

  • удалить дубликаты
  • удалить все элементы по определенным критериям, а точнее, я хочу удалить все элементы, превышающие определенное значение.

Я полагал, что могу использовать фильтр для 2 и использовать набор для достижения 1 что-то вроде

list(set(filter(lambda x:x<C, l)))

есть ли лучший/более питонский/более эффективный способ?

Ответ 1

Использование понимания списка может быть более "питоническим".

filtered = [x for x in set(lst) if x < C]

Ответ 2

Лучшие два способа сделать это - фильтр:

new_list = list(set(filter(lambda x:x<C, l)))

Или задайте понимание (что многие считают более пифоническим и даже более эффективным):

list({x for x in l if x < C})

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

Ответ 3

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

A = {0, 1, 4, 5, 8}; 
B = {2, 1, 3, 4, 6}; 

print("Union :", A | B) 

print("Intersection :", A & B) 

print("Difference :", A - B) 

print("Symmetric difference :", A ^ B) 

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

A - {5,}

и как и в этом вопросе, если вам нужно фильтровать для более больших значений, чем C, вы просто набираете "оператор проверки содержимого" в "in", который в коде Python выполняет наборы. магический метод содержит() (магический метод не должен вызываться напрямую, поэтому вы используете "в"):

{x for x in l if x > C}