una sacar palabra llenar listas lista len elementos definir comando buscar agregar python unit-testing

sacar - ¿Cómo afirmar dos listas contiene los mismos elementos en Python?



llenar una lista en python (5)

Esta pregunta ya tiene una respuesta aquí:

Al escribir casos de prueba, a menudo necesito afirmar que dos listas contienen los mismos elementos sin tener en cuenta su orden.

He estado haciendo esto convirtiendo las listas en conjuntos.

¿Hay alguna manera más simple de hacer esto?

EDITAR :

Como señaló @MarkDickinson, puedo usar TestCase.assertItemsEqual .

Observa que TestCase.assertItemsEqual es nuevo en Python2.7. Si está utilizando una versión anterior de Python, puede usar unittest2 - un respaldo de las nuevas características de Python 2.7.


A partir de Python 3.2 unittest.TestCase.assertItemsEqual ha sido reemplazado por unittest.TestCase.assertCountEqual que hace exactamente lo que estás buscando, como puedes leer en la documentación de la biblioteca estándar de python. El método tiene un nombre engañoso pero hace exactamente lo que estás buscando.

ayb tienen los mismos elementos en el mismo número, independientemente de su orden

Aquí un ejemplo simple que compara dos listas que tienen los mismos elementos pero en un orden diferente.

  • usando assertCountEqual la prueba tendrá éxito
  • utilizando assertListEqual la prueba fallará debido a la diferencia de orden de las dos listas

Aquí un pequeño script de ejemplo.

import unittest class TestListElements(unittest.TestCase): def setUp(self): self.expected = [''foo'', ''bar'', ''baz''] self.result = [''baz'', ''foo'', ''bar''] def test_count_eq(self): """Will succeed""" self.assertCountEqual(self.result, self.expected) def test_list_eq(self): """Will fail""" self.assertListEqual(self.result, self.expected) if __name__ == "__main__": unittest.main()

Nota al margen: asegúrese de que los elementos en las listas que está comparando sean ordenables.


Convertir sus listas en conjuntos le dirá que contienen los mismos elementos. Pero este método no puede confirmar que contengan la misma cantidad de todos los elementos. Por ejemplo, su método fallará en este caso:

L1 = [1,2,2,3] L2 = [1,2,3,3]

Probablemente sea mejor que clasifique las dos listas y las compare:

def checkEqual(L1, L2): if sorted(L1) == sorted(L2): print "the two lists are the same" return True else: print "the two lists are not the same" return False

Tenga en cuenta que esto no altera la estructura / contenido de las dos listas. Por el contrario, la clasificación crea dos listas nuevas



Las necesidades aseguran la biblioteca, pero usted puede comparar la lista por:

garantizar ([1, 2]). contains_only ([2, 1])

Esto no aumentará la afirmación de excepción. La documentación de thin es realmente delgada, así que recomendaría mirar los códigos de seguridad en github


Versión un poco más rápida de la implementación (si sabe que la mayoría de las listas de parejas tendrán diferentes longitudes):

def checkEqual(L1, L2): return len(L1) == len(L2) and sorted(L1) == sorted(L2)

Comparando:

>>> timeit(lambda: sorting([1,2,3], [3,2,1])) 2.42745304107666 >>> timeit(lambda: lensorting([1,2,3], [3,2,1])) 2.5644469261169434 # speed down not much (for large lists the difference tends to 0) >>> timeit(lambda: sorting([1,2,3], [3,2,1,0])) 2.4570400714874268 >>> timeit(lambda: lensorting([1,2,3], [3,2,1,0])) 0.9596951007843018 # speed up