¿Cómo verifico si una lista está vacía?
Por ejemplo, si pasó lo siguiente:
a = []
¿ Cómo verifico si a
está vacío?
if not a:
print("List is empty")
Usar la booleanidad implícita del vacío list
es bastante pitónico.
La forma Pythonic de hacerlo es de la guía de estilo PEP 8 .
Para secuencias (cadenas, listas, tuplas), utilice el hecho de que las secuencias vacías son falsas:
# Correct: if not seq: if seq: # Wrong: if len(seq): if not len(seq):
Lo prefiero explícitamente:
if len(li) == 0:
print('the list is empty')
De esta manera queda 100% claro que li
es una secuencia (lista) y queremos probar su tamaño. Mi problema if not li: ...
es que da la falsa impresión de que li
es una variable booleana.
Este es el primer resultado de Google para "matriz vacía de prueba de Python" y consultas similares, y otras personas están generalizando la pregunta más allá de las listas, por lo que aquí hay una advertencia para un tipo diferente de secuencia que mucha gente usa.
Otros métodos no funcionan para matrices NumPy
Debe tener cuidado con las matrices NumPy, porque otros métodos que funcionan bien para list
s u otros contenedores estándar fallan con las matrices NumPy. Explico por qué a continuación, pero en resumen, el método preferido es utilizar size
.
La forma "pitónica" no funciona: Parte 1
La forma "pitónica" falla con las matrices NumPy porque NumPy intenta convertir la matriz en una matriz de bool
mensajes de correo electrónico e if x
intenta evaluar todos esos bool
mensajes de correo electrónico a la vez para buscar algún tipo de valor de verdad agregado. Pero esto no tiene ningún sentido, entonces obtienes un ValueError
:
>>> x = numpy.array([0,1])
>>> if x: print("x")
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
La forma "pitónica" no funciona: Parte 2
Pero al menos el caso anterior te dice que falló. Si tiene una matriz NumPy con exactamente un elemento, la if
declaración "funcionará", en el sentido de que no obtendrá un error. Sin embargo, si ese elemento resulta ser 0
(o 0.0
, o False
, ...), la if
declaración resultará incorrectamente en False
:
>>> x = numpy.array([0,])
>>> if x: print("x")
... else: print("No x")
No x
¡Pero claramente x
existe y no está vacío! Este resultado no es el que querías.
El uso len
puede dar resultados inesperados.
Por ejemplo,
len( numpy.zeros((1,0)) )
devuelve 1, aunque la matriz tenga cero elementos.
La forma numpitónica
Como se explica en las preguntas frecuentes de SciPy , el método correcto en todos los casos en los que sepa que tiene una matriz NumPy es utilizar if x.size
:
>>> x = numpy.array([0,1])
>>> if x.size: print("x")
x
>>> x = numpy.array([0,])
>>> if x.size: print("x")
... else: print("No x")
x
>>> x = numpy.zeros((1,0))
>>> if x.size: print("x")
... else: print("No x")
No x
Si no está seguro de si podría ser un list
, una matriz NumPy u otra cosa, puede combinar este enfoque con la respuesta que da @dubiousjim para asegurarse de que se utilice la prueba correcta para cada tipo. No es muy "pitónico", pero resulta que NumPy rompió intencionalmente la pitonicidad al menos en este sentido.
Si necesita hacer algo más que simplemente verificar si la entrada está vacía y está utilizando otras funciones de NumPy como indexación u operaciones matemáticas, probablemente sea más eficiente (y ciertamente más común) forzar que la entrada sea una matriz NumPy. Hay algunas funciones interesantes para hacer esto rápidamente, la más importante numpy.asarray
. Esto toma su entrada, no hace nada si ya es una matriz, o envuelve su entrada en una matriz si es una lista, tupla, etc., y opcionalmente la convierte al archivo dtype
. Por lo tanto, es muy rápido siempre que puede ser y garantiza que puedas asumir que la entrada es una matriz NumPy. Por lo general, incluso usamos el mismo nombre, ya que la conversión a una matriz no volverá a salir del alcance actual :
x = numpy.asarray(x, dtype=numpy.double)
Esto hará que la x.size
verificación funcione en todos los casos que veo en esta página.