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.