Listeler için kısa bir içerme fonksiyonu var mı?


514

İnsanların anylistede bir öğe olup olmadığını görmek için başka bir liste toplamak için kullandıklarını görüyorum, ancak bunu yapmanın hızlı bir yolu var mı ?:

if list.contains(myItem):
    # do something

Sorunuz sadece listenin öğe içerdiğini , liste alt listeyi içermediğini mi gösteriyor? / tuple / set / frozenset / ...?
smci

Yanıtlar:


873

Bu sözdizimini kullanabilirsiniz:

if myItem in list:
    # do something

Ayrıca, ters operatör:

if myItem not in list:
    # do something

Listeler, tuples, setler ve dikmeler için iyi çalışır (onay tuşları).

Not Bu listeler ve küpe bir O (n) bir işlemdir, ancak bu setleri ve dicts bir O (1) çalışması.


1
Numpy dizileri içeren bir listeyle, numpy örnekleri içindeki numpy örnekleri veya değerleri kontrol eder mi?
Daniel Möller

Dikkat ! Muhtemelen beklemediğiniz gibi bu maçlar:o='--skip'; o in ("--skip-ias"); # returns True !
Alex F

3
@AlexF: ("--skip-ias")Bir tuple değil, bir dize olduğu için eşleşir (parantezler hiçbir şey yapmaz, (1)tıpkı bir tamsayı gibi). 1 demet istiyorsanız, tek öğeden sonra virgül eklemeniz gerekir: ("--skip-ias",)(veya (1,)).
Blckknght

Karakterleri karşılaştırıyorsanız, bunun büyük / küçük harfe duyarlı olmadığını unutmayın.
Tillson

65

Diğerlerinin söylediklerine ek olarak in, list.__contains__yöntemi çağırmanın ne olduğunu, yazdığınız herhangi bir sınıfta tanımlayabileceğinizi ve python'u tam olarak kullanmak için son derece kullanışlı olabileceğini bilmek de ilginizi çekebilir .  

Aptal bir kullanım şunlar olabilir:

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

TrueBir liste, bir öğenin herhangi bir sayıda tekrarını Falseiçeriyorsa veya hiç bir olay veya hiç bir şey içermiyorsa almak için bu tek astarla geldim . Kullanmak next(...), buna varsayılan bir dönüş değeri ( False) verir ve tüm liste kavrayışını çalıştırmaktan çok daha hızlı çalışması gerektiği anlamına gelir.

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


Benim durumumda Kategori adlı nesnenin bir listesi var ve sadece Link özelliği için test etmek için bir ihtiyaç var, bu yüzden bu çözümler benim durumumda daha iyi uyuyor. Teşekkürler
rodrigorf

3
any(item == test_item for item in list_to_test)Ben de işe yarayacağını düşünüyorum.
Biri

3

Öğe yoksa liste yöntemi indexdöndürülür ve -1varsa öğenin dizinini döndürür. Alternatif olarak, bir ififadede aşağıdakileri yapabilirsiniz:

if myItem in list:
    #do things

Ayrıca, bir öğenin aşağıdaki if ifadesine sahip bir listede olmadığını kontrol edebilirsiniz:

if myItem not in list:
    #do things

15
indexYöntem dönmez -1 elemanı mevcut değilse, bir atar ValueErrordurum.
MondKin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.