2010-01-28 20 views
45

Biorąc pod uwagę listę ['a','ab','abc','bac'], chcę obliczyć listę z ciągami, które mają w sobie 'ab'. To znaczy. wynikiem jest ['ab','abc']. Jak to zrobić w Pythonie?Filtrowanie listy łańcuchów na podstawie zawartości

+0

dzięki Eli Bendersky –

+0

Zważywszy na listy [” a ',' b ',' c ',' a ',' b '], chcę obliczyć listę z łańcuchami, które mają w sobie "a" i "b". To znaczy. wynikiem jest ["a", "b"]. Jak to zrobić w Pythonie? –

Odpowiedz

71

To proste filtrowanie można osiągnąć na wiele sposobów z Pythona. Najlepszym rozwiązaniem jest użycie "listowych" w następujący sposób:

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

Innym sposobem jest użycie filter funkcję:

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

-1: Lambda. Proszę nie zadawać lambda na n00bs. –

+26

@ S.Lott: dlaczego? Co jest złego w uczeniu się przydatnych tematów programowania zaawansowanego w odpowiednim kontekście? –

+0

@Edi Bendersky: Bo są bardziej zagmatwane niż użyteczne? Ponieważ prowadzi to do pytań, na które odpowiada "użyj def"? Ponieważ rzadko prowadzi do czegoś lepszego niż kod golfa? Nie wiem, wydają mi się bezużyteczne po 30 latach programowania w wielu różnych językach. Ale myślę, że są dla ciebie naprawdę ważne. –

12
[x for x in L if 'ab' in x] 
+0

wygrywasz przez 48 sekund :-) –

3

Tried to się szybko w interaktywnej powłoki:

>>> 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 oznaczających: "jest podciągiem".

Ponadto, warto rozważyć wypisywanie pętlę w przeciwieństwie do korzystania z list comprehension syntax używany powyżej:

l = ['a', 'ab', 'abc', 'bac'] 
result = [] 
for s in l: 
    if 'ab' in s: 
     result.append(s) 
0
mylist = ['a', 'ab', 'abc'] 
assert 'ab' in mylist 
5
# To support matches from the beginning, not any matches: 

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

filter(lambda x: x.startswith(prefix), list) 
Powiązane problemy