3048 votos

La mejor manera de comprobar si una lista está vacía

Por ejemplo, si se aprueba la siguiente:

a = []

¿Cómo puedo comprobar si a está vacía?

4331voto

Patrick Puntos 20392
if not a:
  print "List is empty"

El uso de la implícito booleanness de la lista vacía es bastante python.

954voto

Harley Holcombe Puntos 34618

El python el modo de hacerlo es a partir de la guía de estilo:

Para las secuencias, (cadenas, listas, tuplas), utilice el hecho de que las secuencias vacías son falsas.

Sí:

if seq:
if not seq:

No:

if len(seq):
if not len(seq):

584voto

Jabba Puntos 1664

Yo prefiero que explícitamente:

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

De esta manera es 100% claro que li es una secuencia (de la lista) y queremos poner a prueba su tamaño. Mi problema con if not li: ... es que da la falsa impresión de que li es una variable boolean.

235voto

Mike Puntos 2409

Otros métodos no funcionan para numpy matrices

Otras personas parecen ser la generalización de su pregunta más allá lists, por lo que pensé que me gustaría añadir una advertencia para un tipo diferente de la secuencia en la que un montón de gente que podría usar. Usted necesita tener cuidado con numpy matrices, ya que otros métodos que funcionan muy bien para lists fallar por numpy matrices. Puedo explicar por qué a continuación, pero en resumen, el método preferido es usar size.

El "python" modo no trabajo yo

El "python" la forma de falla con numpy matrices porque numpy intenta poner en la matriz a una matriz de bools, if x intenta evaluar todas aquellas bools de una vez para algún tipo de agregado de valor de verdad. Pero esto no tiene ningún sentido, por lo que obtener 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()

El "python" modo no trabajo II

Pero al menos en el caso de arriba te dice que no. Si le sucede que tiene una colección de matriz con exactamente un elemento, la if declaración de "obra", en el sentido de que no obtendrá un error. Sin embargo, si un elemento pasa a ser 0 (o 0.0o false, ...), la if instrucción incorrectamente resultado 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 lo que usted quería.

Utilizando len puede dar resultados inesperados

Por ejemplo,

len( numpy.zeros((1,0)) )

devuelve 1, aunque la matriz tiene cero elementos.

El numpythonic manera

Como se explica en el scipy FAQ, el método correcto en todos los casos en los que usted sabe que usted tiene una colección de la matriz es el uso de 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 usted no está seguro de si podría ser un list, una colección de la matriz, o algo más, debe combinar este enfoque con la respuesta @dubiousjim da para asegurarse de que el derecho es un examen utilizado para cada tipo. No muy "python", pero resulta que el propio python no es python en este sentido, ya sea...

117voto

Peter Hoffmann Puntos 13823

Una lista vacía es en sí mismo considerado falso en verdadero valor de prueba (consulte la documentación de python):

a = []
if a:
     print "not empty"

@Daren Thomas

EDIT: Otro punto en contra de las pruebas la lista vacía como Falsa: ¿Qué acerca de el polimorfismo? No debes depender de una lista de lista. Sólo debe cuac como un pato - ¿cómo vas para obtener su duckCollection a cuac "Falso" cuando no tiene elementos?

Su duckCollection debe implementar __nonzero__ o __len__ para el si: funciona sin problemas.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X