Apakah ada fungsi isi untuk daftar?


515

Saya melihat orang-orang menggunakan anyuntuk mengumpulkan daftar lain untuk melihat apakah suatu barang ada dalam daftar, tetapi apakah ada cara cepat untuk melakukannya ?:

if list.contains(myItem):
    # do something

Pertanyaan Anda menyiratkan Anda hanya tertarik pada daftar berisi item , bukan daftar berisi sublist? / tuple / set / frozenset / ...?
smci

Jawaban:


875

Anda dapat menggunakan sintaks ini:

if myItem in list:
    # do something

Juga, operator terbalik:

if myItem not in list:
    # do something

Ini berfungsi dengan baik untuk daftar, tupel, set, dan dicts (centang tombol).

Perhatikan bahwa ini adalah operasi O (n) dalam daftar dan tupel, tetapi operasi O (1) dalam set dan dikt.


1
Dengan daftar yang berisi array numpy, akankah ini memeriksa instance atau nilai numpy di dalam instance numpy?
Daniel Möller

Waspadalah! Ini cocok sementara ini sangat mungkin apa yang tidak Anda harapkan:o='--skip'; o in ("--skip-ias"); # returns True !
Alex F

3
@AlexF: Itu cocok karena ("--skip-ias")bukan tupel, tetapi string (tanda kurung tidak melakukan apa-apa, sama seperti (1)hanya bilangan bulat). Jika Anda ingin 1-tuple, Anda perlu menambahkan koma setelah satu item: ("--skip-ias",)(atau (1,)).
Blckknght

Perhatikan bahwa jika Anda membandingkan karakter, ini tidak peka huruf besar-kecil.
Tillson

65

Selain apa yang dikatakan orang lain, Anda mungkin juga tertarik untuk mengetahui bahwa apa yang indilakukan adalah memanggil list.__contains__metode, yang dapat Anda definisikan pada kelas apa pun yang Anda tulis dan bisa sangat berguna untuk menggunakan python sepenuhnya.  

Penggunaan bodoh mungkin:

>>> 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

Saya datang dengan liner satu ini baru-baru ini untuk mendapatkan Truejika daftar berisi sejumlah kemunculan suatu item, atau Falsejika tidak mengandung kemunculan atau tidak sama sekali. Menggunakan next(...)memberikan ini nilai pengembalian default ( False) dan berarti itu harus berjalan secara signifikan lebih cepat daripada menjalankan seluruh pemahaman daftar.

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


Dalam kasus saya, saya memiliki daftar objek yang disebut Kategori dan perlu untuk menguji hanya untuk Link properti, sehingga solusi ini lebih cocok dalam kasus saya. Terima kasih
rodrigorf

3
any(item == test_item for item in list_to_test)akan bekerja juga, saya pikir?
seseorang

3

Metode daftar indexakan kembali -1jika item tidak ada, dan akan mengembalikan indeks item dalam daftar jika ada. Atau dalam ifpernyataan Anda dapat melakukan hal berikut:

if myItem in list:
    #do things

Anda juga dapat memeriksa apakah suatu elemen tidak ada dalam daftar dengan pernyataan if berikut ini:

if myItem not in list:
    #do things

15
The indexMetode tidak kembali -1 jika elemen tidak hadir, itu melemparkan ValueErrorpengecualian.
MondKin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.