str.startswith พร้อมกับรายการสตริงที่จะทดสอบ


183

ฉันพยายามหลีกเลี่ยงการใช้คำสั่งและการเปรียบเทียบจำนวนมากและใช้รายการ แต่ไม่แน่ใจว่าจะใช้กับ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"

สิ่งที่ฉันต้องการให้เป็นคือ:

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

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม


7
คำตอบสำหรับคำถามนี้ทำให้ฉันนึกถึงว่าทำไมฉันถึงรัก Python มาก!
dotancohen

แม้ว่าคุณจะต้องทำการตรวจสอบหลายครั้งด้วยเหตุผลบางอย่างคุณควรบันทึกผลลัพธ์ของˋlower () ˋ ไม่มีจุดประสงค์ในการทำเช่นนั้นซ้ำแล้วซ้ำอีก
Bachsau

คำตอบ:


346

str.startswith ช่วยให้คุณสามารถจัดหา tuple ของสตริงเพื่อทดสอบ:

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

จากเอกสาร :

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

ย้อนกลับTrueถ้าสตริงเริ่มต้นด้วยมิฉะนั้นกลับprefix ยังสามารถเป็น tuple ของคำนำหน้าเพื่อค้นหาFalseprefix

ด้านล่างเป็นการสาธิต:

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

3
และถ้ามันไม่สนับสนุนสิ่งนี้คุณสามารถทำได้ด้วยanyและ genexp
user2357112 รองรับ Monica

Counterfactual conditional ไม่ใช่ "บางที OP อยู่ในเวอร์ชั่นเก่า"
user2357112 รองรับ Monica

เฮ้ถ้าฉันใช้สิ่งนี้เป็นส่วนหนึ่งของฟังก์ชั่นฉันจะทำให้มันคืนสินค้าจากรายการที่ตรงกับมันได้อย่างไร
roastbeeef

@roastbeeefˋforˋ วนซ้ำ ไม่มีตัวเลือกอื่น ;)
Bachsau

26

คุณยังสามารถใช้งานany()ได้map()เช่น:

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

หรืออีกวิธีหนึ่งโดยใช้นิพจน์ตัวสร้าง :

if any(l.startswith(s) for s in x)
    pass # Do something

6
อย่าใช้ความเข้าใจในรายการกับสิ่งใด ใช้เครื่องกำเนิดไฟฟ้า
DylanYoung
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.