Bir dizge listesini içeriğe göre filtreleme


102

Liste göz önüne alındığında, içinde ['a','ab','abc','bac']bulunan dizelerle bir liste hesaplamak istiyorum 'ab'. Yani sonuç ['ab','abc']. Bu Python'da nasıl yapılabilir?

Yanıtlar:


170

Bu basit filtreleme, Python ile pek çok şekilde gerçekleştirilebilir. En iyi yaklaşım, "liste anlamalarını" aşağıdaki gibi kullanmaktır:

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

Başka bir yol da filterişlevi kullanmaktır . Python 2'de:

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

Python 3'te bir liste yerine bir yineleyici döndürür , ancak onu çevirebilirsiniz:

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

Anlamak daha iyi bir uygulama olsa da.


30
@ S.Lott: neden? Uygun bir bağlamda yararlı gelişmiş programlama konularını öğrenmenin nesi yanlış?
Eli Bendersky

12
@ S.Lott: Bence lambdalar, bazı programlama paradigmaları için önemli olan birinci sınıf nesneler olarak fonksiyonların değerlendirilmesini kolaylaştırıyor. Benim için çok önemli olduklarını söyleyemem , ancak yeni başlayanların bile programlama hakkında bu şekilde düşünmekten fayda sağlayacağına inanıyorum ve kesinlikle buna zorlama demezdim .
Eli Bendersky

6
@ S.Lott: ama bu durumda lambdamükemmel bir arkadaş değil filtermi? Sadece abverilen listede olup olmadığını kontrol etmek için ayrı bir işlev yazmanın aşırı bir şey olduğunu düşünüyorum . Bu yüzden, inoperatörü temelde saran daha genel bir işlev yazmaktır . Burada filterolmadan daha net bir şekilde nasıl kullanırsınız lambda?
Eli Bendersky

5
Bu cevabı bulan sadece sayılar değil
Bryan,

9
Ben bir n00b'im ve şimdi lambda ile tanıştım. bilmek harika hissediyorum. şimdi bunun hakkında daha çok şey öğreneceğim.
a_secenthusiast


16
# To support matches from the beginning, not any matches:

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

filter(lambda x: x.startswith(prefix), items)

Bu bir python nesne türü olduğundan listeyi değişken adı olarak kullanmaktan kaçının.
Rutger Hofste

6

Bunu etkileşimli kabukta çabucak denedim:

>>> l = ['a', 'ab', 'abc', 'bac']
>>> [x for x in l if 'ab' in x]
['ab', 'abc']
>>>

Bu neden işe yarıyor? Çünkü inoperatör ortalama için dizeleri için tanımlanmıştır: "nin alt dize olduğunu".

Ayrıca, yukarıda kullanılan liste anlama sözdizimini kullanmak yerine döngüyü yazmayı düşünebilirsiniz :

l = ['a', 'ab', 'abc', 'bac']
result = []
for s in l:
   if 'ab' in s:
       result.append(s)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.