webentwicklung-frage-antwort-db.com.de

Wie kann man behaupten, dass zwei Listen dieselben Elemente in Python enthalten?

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.

130
satoru

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
47
defuz

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.

  • mit assertCountEqual ist der Test erfolgreich
  • bei Verwendung von assertListEqual schlägt der Test aufgrund der unterschiedlichen Reihenfolge der beiden Listen fehl

Hier 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.

108
flazzarini

Gegeben

l1 = [a,b]
l2 = [b,a]

In Python > = 3.0

assertCountEqual(l1, l2) # True

In Python > = 2.7 wurde die obige Funktion benannt:

assertItemsEqual(l1, l2) # True

In Python <2.7

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
25
Cory Klein

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

19
inspectorG4dget

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

1
radeklos