python plot - ¿Cómo probar múltiples variables contra un valor?




title matplotlib (16)

Creo que esto lo manejará mejor:

my_dict = {0: "c", 1: "d", 2: "e", 3: "f"}

def validate(x, y, z):
    for ele in [x, y, z]:
        if ele in my_dict.keys():
            return my_dict[ele]

Salida:

print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e

Estoy tratando de hacer una función que compare varias variables con un entero y genere una cadena de tres letras. Me preguntaba si había una manera de traducir esto a Python. Así que di:

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

que devolvería una lista de

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

¿Es algo como esto posible?


Para verificar si un valor está contenido dentro de un conjunto de variables, puede usar los módulos incorporados itertools y el operator .

Por ejemplo:

Importaciones:

from itertools import repeat
from operator import contains

Declarar variables:

x = 0
y = 1
z = 3

Crea mapeo de valores (en el orden que quieras verificar):

check_values = (0, 1, 3)

Usa itertools para permitir la repetición de las variables:

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

Finalmente, use la función de map para crear un iterador:

checker = map(contains, check_vars, check_values)

Luego, al verificar los valores (en el orden original), use next() :

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

etc ...

Esto tiene una ventaja sobre la lambda x: x in (variables) porque el operator es un módulo incorporado y es más rápido y más eficiente que usar lambda que tiene que crear una función personalizada en el lugar.

Otra opción para verificar si hay un valor distinto de cero (o Falso) en una lista:

not (x and y and z)

Equivalente:

not all((x, y, z))

Se puede hacer fácilmente como

for value in [var1,var2,var3]:
     li.append("targetValue")

d = {0:'c', 1:'d', 2:'e', 3: 'f'}
x, y, z = (0, 1, 3)
print [v for (k,v) in d.items() if x==k or y==k or z==k]

Una solución de línea:

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

La forma directa de escribir x or y or z == 0 es

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

Pero no creo, te guste. :) Y esta manera es fea.

La otra manera (una mejor) es:

0 in (x, y, z)

Por cierto un montón de if s podría escribirse como algo como esto

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

Si desea utilizar if, else las siguientes afirmaciones son otra solución:

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)

Su problema se resuelve más fácilmente con una estructura de diccionario como:

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

Para probar múltiples variables con un solo valor: if 1 in {a,b,c}:

Para probar varios valores con una variable: if a in {1, 2, 3}:


Si eres muy perezoso, puedes poner los valores dentro de una matriz. Como

list = []
list.append(x)
list.append(y)
list.append(z)
nums = [add numbers here]
letters = [add corresponding letters here]
for index in range(len(nums)):
    for obj in list:
        if obj == num[index]:
            MyList.append(letters[index])
            break

También puedes poner los números y las letras en un diccionario y hacerlo, pero esto probablemente sea MUCHO más complicado que simplemente las declaraciones. Eso es lo que obtienes por tratar de ser más perezoso :)

Una cosa más, tu

if x or y or z == 0:

Se compilará, pero no de la manera que usted quiere. Cuando simplemente pones una variable en una sentencia if (ejemplo)

if b

El programa comprobará si la variable no es nula. Otra forma de escribir la declaración anterior (que tiene más sentido) es

if bool(b)

Bool es una función incorporada en python que básicamente realiza el comando de verificar una declaración booleana (si no sabes qué es eso, es lo que estás tratando de hacer en tu declaración if en este momento :))

Otra forma perezosa que encontré es:

if any([x==0, y==0, z==0])

Solución anterior: Según lo declarado por Martijn Pieters, el formato correcto y más rápido es:

if 1 in {x, y, z}:

El único problema importante que no parece solucionarse es que desea que su lista de salida incluya cada letra después de una declaración de verdadero si.

Usando solo el consejo de Martijn Pieters, ahora tendrías:

if 0 in {x, y, z}:
    Mylist.append("c")
elif 1 in {x, y, z}:
    Mylist.append("d")
...

Problema: la primera instrucción if devolvería verdadero, y nunca llegaría a la siguiente instrucción elif. Así que tu lista simplemente regresaría:

["c"]

Lo que quieres es tener sentencias if separadas para que Python lea cada afirmación si las primeras fueron verdaderas o falsas. Como:

if 0 in {x, y, z}:
    Mylist.append("c")
if 1 in {x, y, z}:
    Mylist.append("d")
if 2 in {x, y, z}:
    Mylist.append("e")
...

Esto funcionará, pero 'si' se siente cómodo usando diccionarios (vea lo que hice allí), puede limpiar esto haciendo un diccionario inicial que asigne los números a las letras que desea, y luego simplemente use un bucle 'for':

numToLetters = {0:"c", 1:"d", 2:"e", 3:"f"}
for number in numToLetters:
    if number in {x, y, z}:
        Mylist.append(numToLetters[number])

Este código puede ser útil

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;

Puedes usar el diccionario:

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

Establecer es el buen enfoque aquí, porque ordena las variables, lo que parece ser tu objetivo aquí. {z,y,x} es {0,1,3} cualquiera que sea el orden de los parámetros.

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

De esta manera, toda la solución es O (n).


Todas las excelentes respuestas proporcionadas aquí se concentran en el requisito específico del póster original y se concentran en la solución if 1 in {x,y,z} presentada por Martijn Pieters.
Lo que ignoran es la implicación más amplia de la pregunta:
¿Cómo pruebo una variable contra múltiples valores?
La solución provista no funcionará para resultados parciales si se usan cadenas, por ejemplo:
Probar si la cadena "Wild" está en múltiples valores

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

para este escenario es más fácil convertir a una cadena

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

Sin embargo, se debe tener en cuenta, como lo menciona @codeforester , que los límites de palabras se pierden con este método, como en:

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

las 3 letras de rot existen en combinación en la lista pero no como una palabra individual. Las pruebas de "podredumbre" fallarían, pero si uno de los elementos de la lista fuera "podredumbre en el infierno", también fallaría.
El resultado final es ser cuidadoso con los criterios de búsqueda si utiliza este método y tenga en cuenta que tiene esta limitación.


Pruebe el siguiente enfoque. Definamos un diccionario llamado mydict con los siguientes datos:

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

Si uno quisiera ordenar el diccionario por claves, se podría hacer algo como:

for key in sorted(mydict.iterkeys()):
    print "%s: %s" % (key, mydict[key])

Esto debería devolver la siguiente salida:

alan: 2
bob: 1
carl: 40
danny: 3

Por otro lado, si uno quisiera ordenar un diccionario por valor (como se pregunta en la pregunta), podría hacer lo siguiente:

for key, value in sorted(mydict.iteritems(), key=lambda (k,v): (v,k)):
    print "%s: %s" % (key, value)

El resultado de este comando (ordenar el diccionario por valor) debe devolver lo siguiente:

bob: 1
alan: 2
danny: 3
carl: 40






python if-statement comparison match boolean-logic