python title matplotlib - Come testare più variabili rispetto a un valore?





9 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]]
axis name add

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?




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



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



Set è il buon approccio qui, perché ordina le variabili, quello che sembra essere il tuo obiettivo qui. {z,y,x} è {0,1,3} indipendentemente dall'ordine dei parametri.

>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']

In questo modo, l'intera soluzione è O (n).




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

Va notato tuttavia, come menzionato da @codeforester , che i confini delle parole vengono persi con questo metodo, come in:

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

le 3 lettere di rot esistono in combinazione nell'elenco ma non come singole parole. I test per "rot" fallirebbero, ma se uno degli elementi della lista fosse "putrefazione", anche quello fallirebbe.
Essendo il risultato, fai attenzione ai tuoi criteri di ricerca se usi questo metodo e tieni presente che ha questa limitazione.




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;



Il modo più mnemonico di rappresentare il tuo pseudo-codice in Python sarebbe:

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

if any(v == 0 for v in (x, y, z)):
    mylist.append("c")
if any(v == 1 for v in (x, y, z)):
    mylist.append("d")
if any(v == 2 for v in (x, y, z)):
    mylist.append("e")
if any(v == 3 for v in (x, y, z)):
    mylist.append("f")



Per testare più variabili con un singolo valore: if 1 in {a,b,c}:

Per testare più valori con una variabile: if a in {1, 2, 3}:




Puoi usare il dizionario:

x = 0
y = 1
z = 3
list=[]
dict = {0: 'c', 1: 'd', 2: 'e', 3: 'f'}
if x in dict:
    list.append(dict[x])
else:
    pass

if y in dict:
    list.append(dict[y])
else:
    pass
if z in dict:
    list.append(dict[z])
else:
    pass

print list



Related