Există o funcție scurtă „conține” pentru liste? (Programare, Python, Lista, Căutare, Colecții, Conține)

Joan Venge a intrebat.

Văd că oamenii folosesc any pentru a aduna o altă listă pentru a vedea dacă un element există într-o listă, dar există o modalitate rapidă de a face doar?:

if list.contains(myItem):
    # do something

Comentarii

  • Întrebarea dvs. implică faptul că sunteți interesat doar de lista conține elementul, și nu lista conține sublistă? /tuple/ set/ set/ frozenset/…? –  > Por smci.
4 răspunsuri
defuz

Poți folosi această sintaxă:

if myItem in list:
    # do something

De asemenea, operatorul invers:

if myItem not in list:
    # do something

Funcționează bine pentru liste, tuple, seturi și dicte (chei de verificare).

Notă că aceasta este o operație O(n) în liste și tuple, dar o operație O(1) în seturi și dicte.

Comentarii

  • În cazul unei liste care conține matrici numpy, se va verifica dacă există instanțe numpy sau valori în interiorul instanțelor numpy? –  > Por Daniel Möller.
  • Atenție! Acest lucru se potrivește în timp ce acest lucru este foarte probabil ceea ce nu v-ați așteptat: o='--skip'; o in ("--skip-ias"); # returns True ! –  > Por Alex F.
  • @AlexF: Asta se potrivește pentru că ("--skip-ias") nu este o tupla, ci un șir de caractere (parantezele nu fac nimic, la fel ca și (1) este doar un număr întreg). Dacă doriți o 1-tuplu, trebuie să adăugați o virgulă după elementul unic: ("--skip-ias",) (sau (1,)). –  > Por Blckknght.
  • Rețineți că, dacă comparați caractere, acest lucru este insensibil la majuscule și minuscule. –  > Por Tillson.
Ant

În plus față de ceea ce au spus ceilalți, s-ar putea să vă intereseze să știți că ceea ce in este de a apela la list.__contains__ metodă, pe care o poți defini pe orice clasă pe care o scrii și care poate deveni extrem de utilă pentru a folosi python în toată amploarea lui.  

O utilizare stupidă poate fi:

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

Dustin Raimondi

Am găsit recent această linie unică pentru a obține True dacă o listă conține un număr oarecare de apariții ale unui element, sau False dacă nu conține nicio apariție sau nimic. Folosind next(...) oferă o valoare de returnare implicită (False) și înseamnă că ar trebui să ruleze semnificativ mai repede decât să ruleze înțelegerea întregii liste.

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

Comentarii

  • În cazul meu, am o listă de obiecte numită Categorie și am nevoie ca aceasta să testeze doar proprietatea Legătură, astfel încât această soluție se potrivește mai bine în cazul meu. Mulțumiri –  > Por rodrigorf.
  • any(item == test_item for item in list_to_test) ar funcționa de asemenea, cred? –  > Por cineva.
Dl. Squig

Metoda listei index va returna -1 dacă elementul nu este prezent și va returna indexul elementului din listă dacă acesta este prezent. Alternativ, într-o metodă if puteți face următoarele:

if myItem in list:
    #do things

De asemenea, puteți verifica dacă un element nu se află într-o listă cu următoarea instrucțiune if:

if myItem not in list:
    #do things

Comentarii

    15

  • index nu returnează -1 în cazul în care elementul nu este prezent, ci aruncă o eroare de tip ValueError excepție. –  > Por Daniel.