simbolos - ¿Es posible usar ''else'' en una lista de Python?
simbolos en python (6)
Además, ¿estaría en lo cierto al concluir que una lista de comprensión es la forma más eficiente de hacer esto?
Tal vez. Las listas de comprensión no son inherentemente computacionalmente eficientes. Todavía se está ejecutando en tiempo lineal.
Desde mi experiencia personal: reduje significativamente el tiempo de cálculo cuando trato con grandes conjuntos de datos al reemplazar las listas de comprensión (específicamente las anidadas) con las estructuras de tipo para el ciclo / lista que se incluyen arriba. En esta aplicación, dudo que notará una diferencia.
Aquí está el código que estaba tratando de convertir en una lista de comprensión:
table = ''''
for index in xrange(256):
if index in ords_to_keep:
table += chr(index)
else:
table += replace_with
¿Hay alguna manera de agregar la declaración else a esta comprensión?
table = ''''.join(chr(index) for index in xrange(15) if index in ords_to_keep)
Excelentes respuestas, pero solo quería mencionar una palabra clave "pase" que no funcionará en la parte if / else de la lista-comprensión (como se publicó en los ejemplos mencionados anteriormente).
#works
list1 = [10, 20, 30, 40, 50]
newlist2 = [x if x > 30 else x**2 for x in list1 ]
print(newlist2, type(newlist2))
#but this WONT work
list1 = [10, 20, 30, 40, 50]
newlist2 = [x if x > 30 else pass for x in list1 ]
print(newlist2, type(newlist2))
Esto es probado y probado en Python 3.4. El error es el siguiente:
newlist2 = [x if x > 30 else pass for x in list1 ]
SyntaxError: invalid syntax
Por lo tanto, trate de evitar los pass-es en listas de comprensión
La sintaxis a if b else c
es un operador ternario en Python que evalúa aa si la condición b
es verdadera; de lo contrario, se evalúa como c
. Se puede usar en declaraciones de comprensión:
>>> [a if a else 2 for a in [0,1,0,3]]
[2, 1, 2, 3]
Entonces para su ejemplo,
table = ''''.join(chr(index) if index in ords_to_keep else replace_with
for index in xrange(15))
Para usar el else
en la lista de comprensiones en la programación de Python puede probar el siguiente fragmento. Esto resolvería su problema, el fragmento se prueba en python 2.7 y python 3.5.
obj = ["Even" if i%2==0 else "Odd" for i in range(10)]
Si quiere else
, no quiere filtrar la comprensión de la lista, quiere que itere sobre cada valor. Puede usar true-value if cond else false-value
como statement en su lugar, y eliminar el filtro del final:
table = ''''.join(chr(index) if index in ords_to_keep else replace_with for index in xrange(15))
Sí , de lo else
se puede usar en Python dentro de una list
comprehension con una docs.python.org/3/reference/… ("operador ternario"):
>>> [("A" if b=="e" else "c") for b in "comprehension"]
[''c'', ''c'', ''c'', ''c'', ''c'', ''A'', ''c'', ''A'', ''c'', ''c'', ''c'', ''c'', ''c'']
Aquí, los paréntesis "()" son solo para enfatizar la expresión condicional, no son necesariamente necesarios ( precedencia del operador ).
Además, se pueden anidar varias expresiones, lo que da como resultado más código s y más difícil de leer:
>>> ["A" if b=="e" else "d" if True else "x" for b in "comprehension"]
[''d'', ''d'', ''d'', ''d'', ''d'', ''A'', ''d'', ''A'', ''d'', ''d'', ''d'', ''d'', ''d'']
>>>
En una nota relacionada, una comprensión también puede contener su propia (s) condición (es) al final:
>>> ["A" if b=="e" else "c" for b in "comprehension" if False]
[]
>>> ["A" if b=="e" else "c" for b in "comprehension" if "comprehension".index(b)%2]
[''c'', ''c'', ''A'', ''A'', ''c'', ''c'']
Condición s ? Sí, múltiples if
son posibles, y en realidad múltiples for
s también:
>>> [i for i in range(3) for _ in range(3)]
[0, 0, 0, 1, 1, 1, 2, 2, 2]
>>> [i for i in range(3) if i for _ in range(3) if _ if True if True]
[1, 1, 2, 2]
(El guión bajo único _
es un nombre de variable válido ( identifier ) en Python, se usa aquí solo para mostrar que no se usa realmente . Tiene un significado especial en el modo interactivo )
Usar esto para una expresión condicional adicional es posible, pero no es de uso real:
>>> [i for i in range(3)]
[0, 1, 2]
>>> [i for i in range(3) if i]
[1, 2]
>>> [i for i in range(3) if (True if i else False)]
[1, 2]
Las comprensiones también se pueden anidar para crear listas "multidimensionales" ("matrices"):
>>> [[i for j in range(i)] for i in range(3)]
[[], [1], [2, 2]]
Por último, una comprensión no se limita a crear una list
, es decir, a else
y if
también se puede usar de la misma manera en una comprensión set
:
>>> {i for i in "set comprehension"}
{''o'', ''p'', ''m'', ''n'', ''c'', ''r'', ''i'', ''t'', ''h'', ''e'', ''s'', '' ''}
y una comprensión del dictionary
:
>>> {k:v for k,v in [("key","value"), ("dict","comprehension")]}
{''key'': ''value'', ''dict'': ''comprehension''}
La misma sintaxis también se usa para expresiones de generador :
>>> for g in ("a" if b else "c" for b in "generator"):
... print(g, end="")
...
aaaaaaaaa>>>
que se puede usar para crear una tuple
( no hay comprensión de tuplas ).