Inhalt von zwei Listen vergleichen

Angenommen, wir haben zwei Listen und wollen prüfen, ob beide Listen gleich sind oder nicht. Dann gibt es hier zwei Bedeutungen von Gleichheit,

  • Beide Listen müssen dieselben eindeutigen Elemente mit derselben Häufigkeit enthalten, aber die Elemente können in beliebiger Reihenfolge angeordnet sein. 
  • Beide Listen müssen exakt gleich sein, d.h. die Reihenfolge der Elemente muss gleich sein. 

Prüfen, ob zwei Listen gleich sind, unabhängig von der Reihenfolge der Elemente

Angenommen wir haben die folgenden zwei Listen:

first_list = [10, 10, 11, 12, 12, 13, 14, 16, 15, 16, 12]
sec_list = [16, 12, 13, 14, 15, 16, 10, 11, 12, 10, 12]

Beide Listen enthalten ähnliche Elemente mit der gleichen Häufigkeit, aber die Reihenfolge der Elemente ist unterschiedlich. Es gibt verschiedene Möglichkeiten zu prüfen, ob diese Listen gleich sind oder nicht.

Sortieren und Vergleichen, um zu prüfen, ob zwei Listen gleich sind

Wir können sortierte Versionen der beiden Listen erstellen. Wenn die ursprünglichen Listen die gleichen Elemente enthalten, aber in unterschiedlicher Reihenfolge, dann muss die Reihenfolge der Elemente in den sortierten Versionen der Listen ähnlich sein. Durch den Vergleich der sortierten Versionen der Listen können wir also herausfinden, ob die Listen gleich sind oder nicht.

Beispiel:

def check_if_equal(list_1, list_2):
    """ Prüft, ob die beiden Listen gleich lang sind, und wenn ja, 
        vergleicht die sortierten Versionen beider Listen, um zu prüfen, 
        ob beide gleich sind d.h. ähnliche Elemente mit gleicher Häufigkeit enthalten. """

    if len(list_1) != len(list_2):
        return False

    return sorted(list_1) == sorted(list_2)


first_list = [10, 10, 11, 12, 12, 13, 14, 16, 15, 16, 12]
sec_list = [16, 12, 13, 14, 15, 16, 10, 11, 12, 10, 12]

if check_if_equal(first_list, sec_list):
    print('Die Listen sind gleich, sie enthalten die gleichen Elemente in gleicher Häufigkeit.')
else:
    print('Die Listen sind nicht gleich.')

Ausgabe:

Die Listen sind gleich, sie enthalten die gleichen Elemente in gleicher Häufigkeit.

Zuerst wird geprüft, ob die beiden Listen gleich groß sind oder nicht. Wenn beide unterschiedlich groß sind, bedeutet dies, dass die Listen nicht gleich sind. Wenn hingegen beide Listen gleich groß sind, wird eine sortierte Version beider Listen erstellt und mit dem Operator == verglichen, um zu prüfen, ob die Listen gleich sind oder nicht.

Auf diese Weise können wir also zwei Listen unabhängig von der Reihenfolge der Elemente in der Liste vergleichen.

Verwendung von collections.Counter(), um zu prüfen, ob zwei Listen gleich sind

Das collections-Modul bietet eine Klasse Counter. Wir können ein Objekt erstellen, indem wir eine Liste an ihren Konstruktor übergeben:

collections.Counter(list)

Es gibt ein Counter-Objekt zurück, das eine dict-Unterklasse ist und die Häufigkeit jedes einzelnen Elements in der Liste enthält. Um also zu prüfen, ob zwei Listen gleich sind oder nicht, können wir Counter-Objekte aus beiden Listen erstellen und sie dann vergleichen, um zu prüfen, ob beide Listen ähnliche eindeutige Elemente mit der gleichen Häufigkeit enthalten.

import collections

def check_if_equal_2(list_1, list_2):
    """ Prüft, ob beide Listen gleich lang sind, und ermittelt dann die Häufigkeit der einzelnen Elemente in der Liste
        mit collections.Counter.
        Vergleicht dann, ob die beiden Counter-Objekte gleich sind oder nicht, um festzustellen,
        ob die Listen ähnliche Elemente mit gleicher Häufigkeit enthalten."""

    if len(list_1) != len(list_2):
        return False

    return collections.Counter(list_1) == collections.Counter(list_2)


first_list = [10, 10, 11, 12, 12, 13, 14, 16, 15, 16, 12]
sec_list = [16, 12, 13, 14, 15, 16, 10, 11, 12, 10, 12]

if check_if_equal_2(first_list, sec_list):
    print('Die Listen sind gleich, sie enthalten die gleichen Elemente in gleicher Häufigkeit.')
else:
    print('Die Listen sind nicht gleich.')

Ausgabe:

Die Listen sind gleich, sie enthalten die gleichen Elemente in gleicher Häufigkeit.

Mit np.array_equal() prüfen, ob zwei Listen gleich sind

Wir können zwei sortierte Numpy-Arrays aus unseren Listen erstellen und sie dann mit numpy.array_equal() vergleichen, um zu prüfen, ob beide die gleichen Elemente enthalten.

Dieser Ansatz kann nützlich sein, wenn wir eine Liste mit einem Numpy-Array oder mehrdimensionalen Arrays vergleichen wollen.

import numpy as np

first_list = [10, 10, 11, 12, 12, 13, 14, 16, 15, 16, 12]
sec_list = [16, 12, 13, 14, 15, 16, 10, 11, 12, 10, 12]

# Umwandeln beider Listen in sortierte Numpy-Arrays,
# dann die Arrays vergleichen, um zu prüfen, ob sie gleich sind oder nicht
result = np.array_equal(np.array(first_list).sort(), np.array(sec_list).sort())

if result:
    print('Die Listen sind gleich, sie enthalten die gleichen Elemente in gleicher Häufigkeit.')
else:
    print('Die Listen sind nicht gleich.')

Ausgabe:

Die Listen sind gleich, sie enthalten die gleichen Elemente in gleicher Häufigkeit.

Prüfen, ob zwei Listen genau gleich sind | Reihenfolge der Elemente muss gleich sein

Angenommen wir haben die folgenden zwei Listen:

first_list = [10, 11, 12, 13, 14, 15, 16]
sec_list = [10, 11, 12, 13, 14, 15, 16]

Nun wollen wir prüfen, ob die beiden Listen genau gleich sind oder nicht, d.h. ob beide Listen die gleichen Elemente enthalten und zwar in der gleichen Reihenfolge. Dazu müssen wir die beiden Listen Element für Element vergleichen. 

Verwendung vom Operator ==, um zu prüfen, ob zwei Listen identisch sind

Wir können zwei Listen mit dem == Operator direkt vergleichen. Wenn die beiden Listen genau gleich sind, wird True zurückgegeben, sonst False.

first_list = [10, 11, 12, 13, 14, 15, 16]
sec_list = [10, 11, 12, 13, 14, 15, 16]

if first_list == sec_list:
    print('Die Listen sind identisch.')
else:
    print('Die Listen sind nicht identisch.')

Ausgaber:

Die Listen sind identisch.

Das ist der einfachste und schnellste Weg, um zu prüfen, ob die beiden Listen genau gleich sind. Aber es ist gut, auch einige andere Möglichkeiten zu kennen.

Verwendung der Funktionen map() und all(), um zu prüfen, ob zwei Listen genau gleich sind

first_list = [10, 11, 12, 13, 14, 15, 16]
sec_list = [10, 11, 12, 13, 14, 15, 16]

result = all(map(lambda x, y: x == y, first_list, sec_list))

if result:
    print('Die Listen sind identisch.')
else:
    print('Die Listen sind nicht identisch.')

Ausgaber:

Die Listen sind identisch.

Wie funktioniert das?

Die Funktion map() wendet die angegebene Lambda-Funktion auf jedes Element der beiden Listen an und speichert das Ergebnis in einem neuen Array. In unserem Fall handelt es sich um ein bool-Array, da wir innerhalb der Lambda-Funktion prüfen, ob die beiden Elemente gleich sind oder nicht.

bool_list = list(map(lambda x, y: x == y, first_list, sec_list))
print(bool_list)

Ausgabe:

[True, True, True, True, True, True, True]

Die Funktion map() gibt ein neues bool’sches Array zurück, wobei jeder i-te Eintrag in diesem bool’schen Array angibt, ob first_list[i] mit sec_list[i] gleich ist oder nicht. Wenn alle Elemente in diesem boolschen Array True sind, bedeutet dies, dass beide Listen gleich sind. Wir können dies mit der Funktion all() erreichen.

result = all(bool_result)
print(result)

Ausgabe:

True

Die Funktion all() akzeptiert eine Sequenz als Argument und gibt True zurück, wenn alle Elemente in dieser Sequenz True sind. Auf diese Weise können wir also prüfen, ob zwei Listen genau gleich sind.

Verwendung der Funktionen map() und reduce(), um zu prüfen, ob zwei Listen genau gleich sind

from functools import reduce

first_list = [10, 11, 12, 13, 14, 15, 16]
sec_list = [10, 11, 12, 13, 14, 15, 16]

result = reduce(lambda a, b: a and b, map(lambda x, y: x == y, first_list, sec_list))

if result:
    print('Die Listen sind identisch.')
else:
    print('Die Listen sind nicht identisch.')

Ausgaber:

Die Listen sind identisch.

Wie funktioniert das?

Die Funktion map() wendet die angegebene Lambda-Funktion auf jedes Element der beiden Listen an und speichert das Ergebnis in einem neuen Array. In unserem Fall handelt es sich um ein bool-Array, da wir innerhalb der Lambda-Funktion prüfen, ob die beiden Elemente gleich sind oder nicht.

bool_list = list(map(lambda x, y: x == y, first_list, sec_list))
print(bool_list)

Ausgabe:

[True, True, True, True, True, True, True]

Die Funktion map() gibt ein neues bool’sches Array zurück, wobei jeder i-te Eintrag in diesem bool’schen Array angibt, ob first_list[i] mit sec_list[i] gleich ist oder nicht. Wenn alle Elemente in diesem boolschen Array True sind, bedeutet dies, dass beide Listen gleich sind. Wir können dies mit der Funktion reduce() erreichen.

Die Funktion reduce(fun,seq) nimmt eine Funktion und eine Sequenz als Argumente an. Sie gibt einen einzigen Wert nach dieser Logik zurück,

  1. Zunächst wendet sie die Funktion auf die ersten beiden Werte der Sequenz an und speichert das Ergebnis als latest_result. 
  2. Dann wird die Funktion erneut aufgerufen und latest_result zusammen mit dem nächsten Element in der Sequenz übergeben und das Ergebnis als latest_result gespeichert. 
  3. Schritt 2 wird so lange wiederholt, bis alle Elemente der Sequenz durchlaufen wurden. 

Wir können die Funktion reduce() verwenden, um zu prüfen, ob eine boolsche Liste nur True-Elemente enthält oder nicht.

result = reduce(lambda a, b: a and b, bool_list)
print(result)

Ausgabe:

True

So können wir also prüfen, ob zwei Listen genau gleich sind.

Parallel über zwei Listen iterieren, um zu prüfen, ob zwei Listen genau gleich sind

Wir können mit der for-Schleife parallel über beide Listen iterieren. Dazu werden wir beide Listenobjekte zippen, um eine Liste von Tupeln zu erstellen. Das i-te Tupel in dieser Tupelliste enthält das i-te Element der beiden Listen, d.h. (list_1[i], list_2[i]). Dann können wir über diese Liste von Tupeln iterieren, um zu prüfen, ob die beiden Elemente in jedem Tupel gleich sind oder nicht. Wenn jedes Tupel gleiche Elemente in dieser Liste von Tupeln enthält, bedeutet dies, dass beide Listen gleich sind.

def check_if_exactly_equal(list_1, list_2):
    # prüfen, ob beide Listen die dleiche Größe haben
    if len(list_1) != len(list_2):
        return False

    # zip-Objekt von beiden Listen erstellen
    final_list = zip(list_1, list_2)

    # über das zip-Objekt iterieren
    for elem in final_list:
        if elem[0] != elem[1]:
            return False
    return True

first_list = [10, 11, 12, 13, 14, 15, 16]
sec_list = [10, 11, 12, 13, 14, 15, 16]

result = check_if_exactly_equal(first_list, sec_list)

if result:
    print('Die Listen sind identisch.')
else:
    print('Die Listen sind nicht identisch.')

Ausgaber:

Die Listen sind identisch.

 

Dies sind sieben verschiedene Möglichkeiten, in Python zu prüfen, ob zwei Listen gleich sind oder nicht.