Există o modalitate de a utiliza două condiții if în înțelegeri de listă în python [duplicat] (Programare, Python, Lista)

Shiva Krishna Bavandla a intrebat.

Să presupunem că am avut o listă

my_list = ['91 9925479326','18002561245','All the best','good']

Acum vreau să ignor șirurile din listă care încep cu 91 și 18 ca mai jos

result = []
for i in my_list:
   if not '91' in i:
      if not '18' in i:
         result.append(i) 

Așadar, vreau să realizez acest lucru cu ajutorul înțelegerii de liste.

Există vreo modalitate de a scrie două condiții if în cadrul unei compensiuni de listă?

Comentarii

  • @jamylak: Am luat asta ca exemplu oricum mulțumesc pentru editare. –  > Por Shiva Krishna Bavandla.
  • Aveți grijă ca testele dvs. să verifice doar dacă 91 și 18 sunt prezente în orice poziție a șirului. Ar trebui să utilizați str.startswith în schimb: docs.python.org/library/stdtypes.html#str.startswith –  > Por Giulio Piancastelli.
3 răspunsuri
Daniel Roseman
[i for i in my_list if '91' not in i and '18' not in i]

Rețineți că nu ar trebui să utilizați list ca nume de variabilă, umbrește funcția încorporată.

Comentarii

  • (+1) pentru un răspuns corect și pentru modificarea not '91' in i în '91' not in i. –  > Por mgilson.
  • Acest răspuns devine nu mai este atât de concis și curat de îndată ce aveți cinci din zece în loc de două valori de verificat. –  > Por Igor Chubin.
  • Putem face același lucru cu funcția startwith, deoarece uneori lista este formată din șiruri de caractere care încep cu 91, iar alteori cu 18, oricare ar fi acestea, șirurile care încep cu 91 sau 18 ar trebui ignorate din listă.De fapt, șirurile de caractere de aici sunt numerele de telefon 91 9885564213 și 1800 3236 2365.  > Por Shiva Krishna Bavandla.
  • De asemenea, trebuie să observ că această soluție este incorectă deloc, trebuie să verificați valorile cu startswith nu cu in –  > Por Igor Chubin.
  • @IgorChubin – acest răspuns face ceea ce a cerut OP – în principal a tradus bucla for dată într-o listă-comp. –  > Por mgilson.
Igor Chubin

Dacă aveți mai mult de două valori (91 și 18)sau dacă acestea sunt produse dinamiceste mai bine să folosiți această construcție:

[i for i in my_list if not i.startswith(('91', '18'))]

Sau dacă doriți să verificați dacă 91 și 18 se află în șiruri (nu doar la început), utilizați in în loc de startswith:

[i for i in my_list if all(x not in i for x in ['91', '18'])]

Exemplu de utilizare:

>>> my_list = ['91 9925479326','18002561245','All the best','good']
>>> [i for i in my_list if all(not i.startswith(x) for x in ['91', '18'])]
['All the best', 'good']
>>> 

Comentarii

  • Eu prefer: [i for i in my_list if not any(i.startswith(x) for x in ['91', '18'])] dar cred că este o preferință personală –  > Por jamylak.
  • .startswith acceptă, de asemenea, un tuplu de șiruri de caractere, deci poate fi prescurtat la [i for i in my_list if not i.startswith(('91', '18'))]. –  > Por MRAB.
  • @MRAB: Vă mulțumim pentru indiciul perfect! Am actualizat răspunsul și i-am adăugat varianta ta. Vă mulțumesc foarte mult –  > Por Igor Chubin.
heltonbiker

Puteți „unifica” ambele condiții:

if ((not '91' in i) and (not '18' in i))

Comentarii

  • Sau simplificați folosind Legea lui DeMorgan: `if not (’91’ în i sau ’18’ în i) – –  > Por Blckknght.