¿Cómo verifico si una lista está vacía?

Resuelto Ray asked hace 16 años • 27 respuestas

Por ejemplo, si pasó lo siguiente:

a = []

¿ Cómo verifico si aestá vacío?

Ray avatar Sep 10 '08 13:09 Ray
Aceptado
if not a:
    print("List is empty")

Usar la booleanidad implícita del vacío listes bastante pitónico.

Patrick avatar Sep 10 '2008 06:09 Patrick

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):
Harley Holcombe avatar Sep 10 '2008 10:09 Harley Holcombe

Lo prefiero explícitamente:

if len(li) == 0:
    print('the list is empty')

De esta manera queda 100% claro que lies una secuencia (lista) y queremos probar su tamaño. Mi problema if not li: ...es que da la falsa impresión de que lies una variable booleana.

Jabba avatar Sep 05 '2011 00:09 Jabba

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 lists 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 boolmensajes de correo electrónico e if xintenta evaluar todos esos boolmensajes 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 ifdeclaració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 ifdeclaración resultará incorrectamente en False:

>>> x = numpy.array([0,])
>>> if x: print("x")
... else: print("No x")
No x

¡Pero claramente xexiste y no está vacío! Este resultado no es el que querías.

El uso lenpuede 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.sizeverificación funcione en todos los casos que veo en esta página.

Mike avatar Feb 21 '2012 16:02 Mike