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?
Odpowiedzi:
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 filterfunkcji. 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.
lambdaidealnym towarzyszem filterw tym przypadku? Myślę, że napisanie oddzielnej funkcji tylko do sprawdzenia, czy abjest na podanej liście, jest przesadą. Tak samo jest z pisaniem bardziej ogólnej funkcji, która w zasadzie otacza inoperatora. Jak byś używał filterw jaśniejszy sposób bez lambdatutaj?
[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)
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ż inoperator 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)
mylist = ['a', 'ab', 'abc']
assert 'ab' in mylist