mulai dengan dengan daftar string untuk menguji

183

Saya mencoba untuk menghindari menggunakan begitu banyak pernyataan dan perbandingan jika hanya menggunakan daftar, tetapi tidak yakin bagaimana menggunakannya dengan str.startswith:

if link.lower().startswith("js/") or link.lower().startswith("catalog/") or link.lower().startswith("script/") or link.lower().startswith("scripts/") or link.lower().startswith("katalog/"):
    # then "do something"

Yang saya inginkan adalah:

if link.lower().startswith() in ["js","catalog","script","scripts","katalog"]:
    # then "do something"

Bantuan apa pun akan dihargai.

Kekekalan
sumber
7
Jawaban atas pertanyaan ini mengingatkan saya mengapa saya sangat mencintai Python!
dotancohen
Bahkan jika Anda perlu melakukan beberapa pemeriksaan untuk beberapa alasan, Anda harus menyimpan hasil dari ˋlower () ˋ. Tidak ada gunanya melakukan itu lagi dan lagi.
Bachsau

Jawaban:

346

str.startswith memungkinkan Anda untuk memasok sejumlah string untuk menguji:

if link.lower().startswith(("js", "catalog", "script", "katalog")):

Dari dokumen :

str.startswith(prefix[, start[, end]])

Kembali Truejika string dimulai dengan prefix, jika tidak kembali False. prefixjuga bisa menjadi tuple dari awalan yang harus dicari.

Di bawah ini adalah demonstrasi:

>>> "abcde".startswith(("xyz", "abc"))
True
>>> prefixes = ["xyz", "abc"]
>>> "abcde".startswith(tuple(prefixes)) # You must use a tuple though
True
>>>

sumber
3
Dan jika itu tidak mendukung ini, Anda tetap bisa melakukannya dengan anydan sebuah exp.
user2357112 mendukung Monica
Bersyarat kontrafaktual, bukan "mungkin OP ada di versi lama".
user2357112 mendukung Monica
hei, jika saya menggunakan ini sebagai bagian dari fungsi, bagaimana saya bisa mendapatkannya untuk mengembalikan item dari daftar yang cocok?
roastbeeef
@roastbeeef ˋforˋ loop. Tidak ada pilihan lain. ;)
Bachsau
26

Anda juga dapat menggunakan any(), map()seperti:

if any(map(l.startswith, x)):
    pass # Do something

Atau sebagai alternatif, menggunakan ekspresi generator :

if any(l.startswith(s) for s in x)
    pass # Do something
dafinguzman
sumber
6
Jangan gunakan pemahaman daftar dengan siapa pun; gunakan generator.
DylanYoung