Biorąc pod uwagę listę ['a','ab','abc','bac']
, chcę obliczyć listę zawierającą ciągi znaków, które zawierają 'ab'
. To znaczy wynik jest ['ab','abc']
. Jak można to zrobić w Pythonie?
104
To proste filtrowanie można osiągnąć na wiele sposobów w Pythonie. Najlepszym podejściem jest użycie „wyrażeń listowych” w następujący sposób:
>>> lst = ['a', 'ab', 'abc', 'bac']
>>> [k for k in lst if 'ab' in k]
['ab', 'abc']
Innym sposobem jest użycie filter
funkcji. W Pythonie 2:
>>> filter(lambda k: 'ab' in k, lst)
['ab', 'abc']
W Pythonie 3 zwraca iterator zamiast listy, ale możesz go rzucić:
>>> list(filter(lambda k: 'ab' in k, lst))
['ab', 'abc']
Chociaż lepiej jest używać zrozumienia.
lambda
idealnym towarzyszemfilter
w tym przypadku? Myślę, że napisanie oddzielnej funkcji tylko do sprawdzenia, czyab
jest na podanej liście, jest przesadą. Tak samo jest z pisaniem bardziej ogólnej funkcji, która w zasadzie otaczain
operatora. Jak byś używałfilter
w jaśniejszy sposób bezlambda
tutaj?[x for x in L if 'ab' in x]
źródło
# To support matches from the beginning, not any matches: items = ['a', 'ab', 'abc', 'bac'] prefix = 'ab' filter(lambda x: x.startswith(prefix), items)
źródło
Wypróbowałem to szybko w interaktywnej powłoce:
>>> l = ['a', 'ab', 'abc', 'bac'] >>> [x for x in l if 'ab' in x] ['ab', 'abc'] >>>
Dlaczego to działa? Ponieważ
in
operator jest zdefiniowany dla łańcuchów znaków, aby oznaczać: „jest podłańcuchem”.Możesz również rozważyć napisanie pętli w przeciwieństwie do używania składni list składni używanej powyżej:
l = ['a', 'ab', 'abc', 'bac'] result = [] for s in l: if 'ab' in s: result.append(s)
źródło
mylist = ['a', 'ab', 'abc'] assert 'ab' in mylist
źródło