Wenn ich Testfälle schreibe, muss ich oft behaupten, dass zwei Listen die gleichen Elemente enthalten, ohne Rücksicht auf ihre Reihenfolge.
Ich habe dies getan, indem ich die Listen in Mengen konvertiert habe.
Gibt es einen einfacheren Weg, dies zu tun?
[~ # ~] edit [~ # ~] :
Wie @ MarkDickinson hervorhob, kann ich einfach TestCase.assertItemsEqual verwenden.
Stellt fest, dass TestCase.assertItemsEqual
ist neu in Python2.7. Wenn Sie eine ältere Version von Python verwenden, können Sie nittest2 - ein Backport der neuen Funktionen von Python 2.7.
Etwas schnellere Version der Implementierung (Wenn Sie wissen, dass die meisten Paarlisten unterschiedliche Längen haben):
def checkEqual(L1, L2):
return len(L1) == len(L2) and sorted(L1) == sorted(L2)
Vergleiche:
>>> 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
Ab Python 3.2 unittest.TestCase.assertItemsEqual
( doc ) wurde ersetzt durch unittest.TestCase.assertCountEqual
( doc ), der genau das tut, wonach Sie suchen, wie Sie aus der python Standard-Bibliotheksdokumentation . Die Methode lesen können ist etwas irreführend benannt, aber es macht genau das, was Sie suchen.
a und b haben die gleichen Elemente in der gleichen Anzahl, unabhängig von ihrer Reihenfolge
Hier ein einfaches Beispiel, das zwei Listen vergleicht, die die gleichen Elemente haben, aber in einer anderen Reihenfolge.
assertCountEqual
ist der Test erfolgreichassertListEqual
schlägt der Test aufgrund der unterschiedlichen Reihenfolge der beiden Listen fehlHier ein kleines Beispielskript.
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 __== "__main__":
unittest.main()
Seite Hinweis: Bitte stellen Sie sicher, dass die Elemente in den Listen, die Sie vergleichen, sortierbar sind.
Gegeben
l1 = [a,b]
l2 = [b,a]
assertCountEqual(l1, l2) # True
In Python > = 2.7 wurde die obige Funktion benannt:
assertItemsEqual(l1, l2) # True
import unittest2
assertItemsEqual(l1, l2) # True
Über das six
Modul (Beliebige Python Version)
import unittest
import six
class MyTest(unittest.TestCase):
def test(self):
six.assertCountEqual(self, self.l1, self.l2) # True
Wenn Sie Ihre Listen in Mengen konvertieren, werden Sie feststellen, dass sie dieselben Elemente enthalten. Diese Methode kann jedoch nicht bestätigen, dass sie die gleiche Anzahl aller Elemente enthält. In diesem Fall schlägt Ihre Methode beispielsweise fehl:
L1 = [1,2,2,3]
L2 = [1,2,3,3]
Sie sind wahrscheinlich besser dran, die beiden Listen zu sortieren und zu vergleichen:
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
Beachten Sie, dass dies die Struktur/den Inhalt der beiden Listen nicht verändert. Vielmehr werden durch die Sortierung zwei neue Listen erstellt
Benötigt eine Bibliothek, aber Sie können die Liste anhand folgender Kriterien vergleichen:
sicherstellen ([1, 2]). enthält_nur ([2, 1])
Dies löst keine Assert-Ausnahme aus. Die Dokumentation von thin ist wirklich dünn, daher würde ich empfehlen, Achte auf die Codes auf Github