Có một chức năng chứa ngắn cho danh sách?


515

Tôi thấy mọi người đang sử dụng anyđể thu thập một danh sách khác để xem liệu một mục có tồn tại trong danh sách không, nhưng có cách nào nhanh chóng để làm không?:

if list.contains(myItem):
    # do something

Câu hỏi của bạn ngụ ý bạn chỉ quan tâm đến danh sách chứa mục chứ không phải danh sách chứa danh sách phụ? / tuple / set / froundredet / ...?
smci

Câu trả lời:


874

Bạn có thể sử dụng cú pháp này:

if myItem in list:
    # do something

Ngoài ra, toán tử nghịch đảo:

if myItem not in list:
    # do something

Nó hoạt động tốt cho danh sách, bộ dữ liệu, bộ và ký tự (phím kiểm tra).

Lưu ý rằng đây là thao tác O (n) trong danh sách và bộ dữ liệu, nhưng hoạt động O (1) theo bộ và ký tự.


1
Với một danh sách chứa các mảng numpy, điều này sẽ kiểm tra các trường hợp numpy hoặc các giá trị bên trong các thể hiện numpy?
Daniel Möller

Coi chừng! Điều này phù hợp trong khi đây rất có thể là những gì bạn không mong đợi:o='--skip'; o in ("--skip-ias"); # returns True !
Alex F

3
@AlexF: Điều đó khớp bởi vì ("--skip-ias")không phải là một tuple, mà là một chuỗi (dấu ngoặc đơn không làm gì cả, giống như (1)chỉ là một số nguyên). Nếu bạn muốn 1 tuple, bạn cần thêm dấu phẩy sau một mục duy nhất: ("--skip-ias",)(hoặc (1,)).
Blckknght

Lưu ý rằng nếu bạn đang so sánh các ký tự, đây là trường hợp không nhạy cảm.
Tillson

65

Ngoài những gì người khác đã nói, bạn cũng có thể quan tâm để biết rằng những gì inđược gọi làlist.__contains__ phương thức, mà bạn có thể định nghĩa trên bất kỳ lớp nào bạn viết và có thể cực kỳ tiện dụng để sử dụng python ở mức độ đầy đủ.  

Một cách sử dụng ngu ngốc có thể là:

>>> class ContainsEverything:
    def __init__(self):
        return None
    def __contains__(self, *elem, **k):
        return True


>>> a = ContainsEverything()
>>> 3 in a
True
>>> a in a
True
>>> False in a
True
>>> False not in a
False
>>>         

5

Gần đây tôi đã đưa ra một lớp lót này để nhận Truenếu một danh sách có chứa bất kỳ số lần xuất hiện nào của một mặt hàng, hoặc Falsenếu nó không có sự xuất hiện hoặc không có gì cả. Việc sử dụng next(...)cung cấp cho giá trị trả về mặc định này ( False) và có nghĩa là nó sẽ chạy nhanh hơn đáng kể so với việc chạy toàn bộ danh sách.

list_does_contain = next((True for item in list_to_test if item == test_item), False)


Trong trường hợp của tôi, tôi có một danh sách các đối tượng được gọi là Danh mục và chỉ cần kiểm tra đối với Liên kết thuộc tính, vì vậy giải pháp này phù hợp hơn trong trường hợp của tôi. Cảm ơn
Rodrigorf

3
any(item == test_item for item in list_to_test)Tôi cũng sẽ làm việc chứ?
ai đó

3

Phương thức danh sách indexsẽ trả về -1nếu mục không có mặt và sẽ trả về chỉ mục của mục trong danh sách nếu có. Ngoài ra, trong một iftuyên bố, bạn có thể làm như sau:

if myItem in list:
    #do things

Bạn cũng có thể kiểm tra nếu một phần tử không có trong danh sách với câu lệnh if sau:

if myItem not in list:
    #do things

15
Các indexphương pháp không trả lại -1 nếu nguyên tố này là không có mặt, nó ném một ValueErrorngoại lệ.
MondKin 28/03/2015
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.