Враховуючи список ['a','ab','abc','bac'], я хочу обчислити список із рядками, які є 'ab'в них. Тобто результат є ['ab','abc']. Як це можна зробити в Python?
Відповіді:
Ця проста фільтрація може бути досягнута багатьма способами за допомогою 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']
Хоча краще застосовувати розуміння.
lambdaідеальний супутник filterу цьому випадку? Я думаю, що написання окремої функції лише для перевірки, чи abє в даному списку, є надмірним. Так само як і написання більш загальної функції, яка в основному обгортає inоператор. Як би ви використали filterзрозуміліше, не маючи lambdaтут?
[x for x in L if 'ab' in x]
# To support matches from the beginning, not any matches:
items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'
filter(lambda x: x.startswith(prefix), items)
Спробував це швидко в інтерактивній оболонці:
>>> 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)