Фильтрация списка строк по содержимому

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
Этот ответ находят не только новички,
Брайан
9
Я новичок, и теперь я познакомился с лямбдой. чувствую себя потрясающе, узнав об этом. теперь я узнаю об этом больше.
a_secenthusiast
17
[x for x in L if 'ab' in x]
Игнасио Васкес-Абрамс
источник
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)
Дарен Томас
источник
-2
mylist = ['a', 'ab', 'abc']
assert 'ab' in mylist
Янн Рамин
источник