[Python] Come testare più variabili rispetto a un valore?


Answers

Il tuo problema è più facilmente indirizzato con una struttura del dizionario come:

x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
Question

Sto cercando di creare una funzione che confronterà più variabili con un numero intero e restituirà una stringa di tre lettere. Mi stavo chiedendo se ci fosse un modo per tradurre questo in Python. Allora, dici:

x = 0
y = 1
z = 3
mylist = []

if x or y or z == 0 :
    mylist.append("c")
if x or y or z == 1 :
    mylist.append("d")
if x or y or z == 2 :
    mylist.append("e")
if x or y or z == 3 : 
    mylist.append("f")

quale restituirebbe una lista di

["c", "d", "f"]

È possibile qualcosa del genere?




Tutte le eccellenti risposte fornite qui si concentrano sui requisiti specifici del poster originale e si concentrano sulla soluzione if 1 in {x,y,z} proposta da Martijn Pieters.
Quello che ignorano è l'implicazione più ampia della domanda:
Come posso testare una variabile su più valori?
La soluzione fornita non funzionerà per i colpi parziali se si utilizzano le stringhe, ad esempio:
Verifica se la stringa "Wild" è in più valori

>>> x="Wild things"
>>> y="throttle it back"
>>> z="in the beginning"
>>> if "Wild" in {x,y,z}: print (True)
... 

o

>>> x="Wild things"
>>> y="throttle it back"
>>> z="in the beginning"
>>> if "Wild" in [x,y,z]: print (True)
... 

per questo scenario è più semplice convertire in una stringa

>>> [x,y,z]
['Wild things', 'throttle it back', 'in the beginning']
>>> {x,y,z}
{'in the beginning', 'throttle it back', 'Wild things'}
>>> 

>>> if "Wild" in str([x,y,z]): print (True)
... 
True
>>> if "Wild" in str({x,y,z}): print (True)
... 
True



Per verificare se un valore è contenuto in un set di variabili, è possibile utilizzare i moduli itertools e l' operator .

Per esempio:

importazioni:

from itertools import repeat
from operator import contains

Dichiarare le variabili:

x = 0
y = 1
z = 3

Crea una mappatura dei valori (nell'ordine che vuoi controllare):

check_values = (0, 1, 3)

Usa itertools per consentire la ripetizione delle variabili:

check_vars = repeat((x, y, z))

Infine, usa la funzione map per creare un iteratore:

checker = map(contains, check_vars, check_values)

Quindi, quando si controllano i valori (nell'ordine originale), usare next() :

if next(checker)  # Checks for 0
    # Do something
    pass
elif next(checker)  # Checks for 1
    # Do something
    pass

eccetera...

Questo ha un vantaggio rispetto a lambda x: x in (variables) poiché l' operator è un modulo integrato ed è più veloce e più efficiente rispetto all'utilizzo di lambda che deve creare una funzione personalizzata sul posto.

Un'altra opzione per verificare se esiste un valore diverso da zero (o False) in un elenco:

not (x and y and z)

Equivalente:

not all((x, y, z))



Questo codice potrebbe essere utile

L ={x, y, z}
T= ((0,"c"),(1,"d"),(2,"e"),(3,"f"),)
List2=[]
for t in T :
if t[0] in L :
    List2.append(t[1])
    break;



Una soluzione di linea:

mylist = [{0: 'c', 1: 'd', 2: 'e', 3: 'f'}[i] for i in [0, 1, 2, 3] if i in (x, y, z)]

O:

mylist = ['cdef'[i] for i in range(4) if i in (x, y, z)]



Il modo diretto per scrivere x or y or z == 0 è

if any(map((lambda value: value == 0), (x,y,z))):
    pass # write your logic.

Ma non penso, ti piace. :) E in questo modo è brutto.

L'altro modo (un migliore) è:

0 in (x, y, z)

A proposito di molti if s potrebbe essere scritto come qualcosa di simile

my_cases = {
    0: Mylist.append("c"),
    1: Mylist.append("d")
    # ..
}

for key in my_cases:
    if key in (x,y,z):
        my_cases[key]()
        break



Se vuoi usare if, altrimenti le istruzioni che seguono sono un'altra soluzione:

myList = []
aList = [0,1,3]

for l in aList:
    if l==0:myList.append('c')
    elif l==1:myList.append('d')
    elif l==2:myList.append('e')
    elif l==3:myList.append('f')

print(myList)