Memfilter daftar string berdasarkan konten

104

Diberikan daftar ['a','ab','abc','bac'], saya ingin menghitung daftar dengan string yang ada 'ab'di dalamnya. Yaitu hasilnya ['ab','abc']. Bagaimana ini bisa dilakukan dengan Python?

Chris.Jie
sumber

Jawaban:

173

Pemfilteran sederhana ini dapat dicapai dengan banyak cara dengan Python. Pendekatan terbaik adalah dengan menggunakan "pemahaman daftar" sebagai berikut:

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

Cara lain adalah dengan menggunakan filterfungsi tersebut. Dengan Python 2:

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

Di Python 3, ini mengembalikan iterator, bukan daftar, tetapi Anda dapat mentransmisikannya:

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

Meskipun lebih baik menggunakan pemahaman.

Eli Bendersky
sumber
31
@ S. Lott: kenapa? Apa yang salah dengan mempelajari topik pemrograman tingkat lanjut yang berguna dalam konteks yang sesuai?
Eli Bendersky
12
@ S. Lott: Saya pikir lambda memfasilitasi pertimbangan fungsi sebagai objek kelas satu, yang penting untuk beberapa paradigma pemrograman. Saya tidak akan mengatakan mereka sangat penting bagi saya , tetapi saya percaya bahkan pemula pun bisa mendapatkan keuntungan dari memikirkan tentang pemrograman dengan cara ini, dan pasti tidak akan menyebutnya menimbulkan .
Eli Bendersky
6
@ S. Lott: tetapi bukankah lambdateman yang sempurna untuk filterkasus ini? Saya pikir menulis fungsi terpisah hanya untuk memeriksa apakah abada dalam daftar yang diberikan adalah berlebihan. Begitu juga menulis fungsi yang lebih umum yang pada dasarnya membungkus inoperator. Bagaimana Anda akan menggunakan filterdengan cara yang lebih jelas tanpa di lambdasini?
Eli Bendersky
5
Bukan hanya n00bs yang menemukan jawaban ini
Bryan
10
Saya seorang n00b dan sekarang saya diperkenalkan dengan lambda. merasa luar biasa mengetahuinya. sekarang saya akan belajar lebih banyak tentang itu.
antusiasme
17
[x for x in L if 'ab' in x]
Ignacio Vazquez-Abrams
sumber
16
# To support matches from the beginning, not any matches:

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

filter(lambda x: x.startswith(prefix), items)
Itay Maman
sumber
hindari daftar sebagai nama variabel karena ini adalah tipe objek python.
Rutger Hofste
6

Mencoba ini dengan cepat di shell interaktif:

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

Mengapa ini berhasil? Karena inoperator didefinisikan untuk string berarti: "adalah substring dari".

Selain itu, Anda mungkin ingin mempertimbangkan untuk menulis perulangan daripada menggunakan sintaks pemahaman daftar yang digunakan di atas:

l = ['a', 'ab', 'abc', 'bac']
result = []
for s in l:
   if 'ab' in s:
       result.append(s)
Daren Thomas
sumber
-2
mylist = ['a', 'ab', 'abc']
assert 'ab' in mylist
Yann Ramin
sumber