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
Dado
l1 = [a,b]
l2 = [b,a]
assertCountEqual(l1, l2) # True
En Python > = 2.7 , la función anterior fue nombrada:
assertItemsEqual(l1, l2) # True
import unittest2
assertItemsEqual(l1, l2) # True
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