str.starts với một danh sách các chuỗi để kiểm tra


183

Tôi đang cố gắng tránh sử dụng quá nhiều câu lệnh if và so sánh và chỉ đơn giản là sử dụng một danh sách, nhưng không chắc chắn cách sử dụng nó với 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"

Những gì tôi muốn nó là:

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

Bất kỳ trợ giúp sẽ được đánh giá cao.


7
Các câu trả lời cho câu hỏi này nhắc nhở tôi về lý do tại sao tôi yêu Python rất nhiều!
dotancohen

Ngay cả khi bạn cần thực hiện nhiều kiểm tra vì một số lý do, bạn nên lưu kết quả của ˋlower (). Không có điểm trong việc làm điều đó nhiều lần.
Bachsau

Câu trả lời:


346

str.startswith cho phép bạn cung cấp một bộ dây để kiểm tra:

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

Từ các tài liệu :

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

Trả về Truenếu chuỗi bắt đầu bằng prefix, nếu không trả về False. prefixcũng có thể là một bộ tiền tố để tìm kiếm.

Dưới đây là một minh chứng:

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

3
Và nếu nó không hỗ trợ điều này, bạn vẫn có thể làm điều đó với anyvà khai thác gen.
user2357112 hỗ trợ Monica

Điều kiện phản tác dụng, không phải "có lẽ OP đang ở phiên bản cũ".
user2357112 hỗ trợ Monica

này, nếu tôi sử dụng nó như là một phần của hàm, làm thế nào tôi có thể khiến nó trả về mục từ danh sách mà nó khớp?
roastbeeef

@roastbeeef ˋforˋ vòng lặp. Không có lựa chọn khác. ;)
Bạch Dương

26

Bạn cũng có thể sử dụng any(), map()như vậy:

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

Hoặc cách khác, sử dụng một biểu thức trình tạo :

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

6
Đừng sử dụng một sự hiểu biết danh sách với bất kỳ; sử dụng máy phát điện.
DylanYoung 17/07/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.