1) Майже англійський стиль:
Перевірте наявність за допомогою inоператора, а потім застосуйте removeметод.
if thing in some_list: some_list.remove(thing)
removeМетод буде видалити тільки перше входження thing, щоб видалити всі входження , які можна використовувати whileзамість if.
while thing in some_list: some_list.remove(thing)
- Досить простий, напевно, мій вибір. Для невеликих списків (не вдається протистояти одній вкладиші)
Це ставлення стрілянини - перше - запитання - остання - поширене в Python. Замість того, щоб заздалегідь перевірити, чи об'єкт підходить, просто виконайте операцію та вловіть відповідні винятки:
try:
some_list.remove(thing)
except ValueError:
pass # or scream: thing not in some_list!
except AttributeError:
call_security("some_list not quacking like a list!")
Звичайно, другий, окрім пункту у наведеному вище прикладі, є не лише сумнівним гумором, але й зовсім непотрібним (суть полягала в тому, щоб проілюструвати типи качок для людей, не знайомих з цією концепцією).
Якщо ви очікуєте кількох випадків:
while True:
try:
some_list.remove(thing)
except ValueError:
break
- трохи детально для цього конкретного випадку використання, але дуже ідіоматичне в Python.
- це краще, ніж №1
- PEP 463 запропонував коротший синтаксис для спробу / за винятком простого використання, який був би корисним тут, але він не був затверджений.
Однак, використовуючи контекстний менеджер suppress () contextmanager (введений у python 3.4), наведений вище код може бути спрощений до цього:
with suppress(ValueError, AttributeError):
some_list.remove(thing)
Знову ж таки, якщо ви очікуєте кількох випадків:
with suppress(ValueError):
while True:
some_list.remove(thing)
3) Функціональний стиль:
Близько тисяча дев'ятсот дев'яносто три, Python є lambda, reduce(), filter()і map(), люб'язно Лисп хакера , який пропустив їх і представили робочі патчі *. Ви можете використовувати filterдля видалення елементів зі списку:
is_not_thing = lambda x: x is not thing
cleaned_list = filter(is_not_thing, some_list)
Існує ярлик, який може бути корисним для вашої справи: якщо ви хочете відфільтрувати порожні елементи (насправді елементи, де bool(item) == False, наприклад None, нуль, порожні рядки або інші порожні колекції), ви можете передавати None як перший аргумент:
cleaned_list = filter(None, some_list)
- [оновлення] : в Python 2.x, який
filter(function, iterable)використовується як еквівалент [item for item in iterable if function(item)](або [item for item in iterable if item]якщо перший аргумент None); в Python 3.x, це зараз еквівалентно (item for item in iterable if function(item)). Тонка різниця полягає в тому, що фільтр, який використовується для повернення списку, зараз він працює як генераторний вираз - це нормально, якщо ви лише перебираєте очищений список і відкидаєте його, але якщо вам справді потрібен список, вам потрібно вкласти filter()дзвінок з list()конструктором.
- * Ці конструкції з ароматом Ліспі вважаються трохи чужими в Python. Близько 2005 року Гвідо навіть говорив про випадання
filter - разом із супутниками mapта reduce(вони ще не пішли, але їх reduceперенесли у модуль фунікуолів , на що варто звернути увагу, якщо вам подобаються функції високого порядку ).
4) Математичний стиль:
Зрозуміння списків стало кращим стилем для маніпулювання списком у Python з моменту впровадження у версії 2.0 PEP 202 . Обгрунтуванням цього є , що опису списки забезпечують більш короткий спосіб створення списків в ситуаціях , де map()і filter()буде в даний час використовуються і / або вкладені цикли.
cleaned_list = [ x for x in some_list if x is not thing ]
Генераторні вирази були введені у версії 2.4 PEP 289 . Вираз генератора краще для ситуацій, коли вам насправді не потрібно (або хочете) мати повний список, створений в пам'яті - наприклад, коли ви просто хочете переглядати елементи один за одним. Якщо ви переглядаєте лише список, ви можете вважати вираз генератора як ліниве оцінювання списку:
for item in (x for x in some_list if x is not thing):
do_your_thing_with(item)
Примітки
- ви можете використовувати оператор нерівності
!=замість is not( різниця важлива )
- для критиків методів, що передбачають копію списку: всупереч поширеній думці, генераторні вирази не завжди ефективніші, ніж списки розуміння - будь ласка, проаналізуйте, перш ніж скаржитися