Фільтрування списку рядків на основі вмісту


102

Враховуючи список ['a','ab','abc','bac'], я хочу обчислити список із рядками, які є 'ab'в них. Тобто результат є ['ab','abc']. Як це можна зробити в Python?

Відповіді:


170

Ця проста фільтрація може бути досягнута багатьма способами за допомогою Python. Найкращий підхід - використовувати "розуміння списку" наступним чином:

>>> lst = ['a', 'ab', 'abc', 'bac']
>>> [k for k in lst if 'ab' in k]
['ab', 'abc']

Інший спосіб - використання filterфункції. У Python 2:

>>> filter(lambda k: 'ab' in k, lst)
['ab', 'abc']

У Python 3 він повертає ітератор замість списку, але ви можете його створити:

>>> list(filter(lambda k: 'ab' in k, lst))
['ab', 'abc']

Хоча краще застосовувати розуміння.


30
@ S.Lott: чому? Що поганого у вивченні корисних тем для вдосконаленого програмування у відповідному контексті?
Елі Бендерський

12
@ S.Lott: Я думаю, лямбди полегшують розгляд функцій як першокласних об’єктів, що важливо для деяких парадигм програмування. Я б не сказав, що вони дуже важливі для мене , але я вважаю, що навіть новачки можуть отримати користь, якщо подумати про програмування таким чином, і точно не називатимуть це спричиненням .
Елі Бендерський

6
@ S.Lott: але чи не lambdaідеальний супутник filterу цьому випадку? Я думаю, що написання окремої функції лише для перевірки, чи abє в даному списку, є надмірним. Так само як і написання більш загальної функції, яка в основному обгортає inоператор. Як би ви використали filterзрозуміліше, не маючи lambdaтут?
Елі Бендерський

5
Цю відповідь знаходять не тільки n00bs
Брайан

9
Я n00b, і тепер я познайомився з лямбда. відчуваю себе чудово знати це. зараз я дізнаюся про це більше.
a_secenthusiast


16
# To support matches from the beginning, not any matches:

items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'

filter(lambda x: x.startswith(prefix), items)

уникати списку як імені змінної, оскільки це тип об’єкта python.
Рутгер Хофсте

6

Спробував це швидко в інтерактивній оболонці:

>>> l = ['a', 'ab', 'abc', 'bac']
>>> [x for x in l if 'ab' in x]
['ab', 'abc']
>>>

Чому це працює? Оскільки inоператор визначений для рядків, щоб означати: "є підрядком".

Крім того, ви можете розглянути питання про виписування циклу на відміну від використання синтаксису розуміння списку, використовуваного вище:

l = ['a', 'ab', 'abc', 'bac']
result = []
for s in l:
   if 'ab' in s:
       result.append(s)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.