/ / vergleiche einige Elemente in der Liste der Tupel - Python, Liste, Tupel

Vergleichen Sie einige Elemente in der Liste der Tupel - Python, Liste, Tupel

Ich habe zwei Listen mit Tupeln, die in der folgenden Reihenfolge angezeigt werden:

a = [(18, 299, 70, 33), (18, 323, 70, 34),
(18, 448, 70, 35), (18, 548, 70, 36), (18, 613, 70, 37)]

b = [(18, 223, 70, 37), (18, 299, 70, 38),
(18, 323, 70, 39), (18, 448, 70, 40), (18, 548, 70, 41), (18, 613, 70, 42)]

Was ich möchte:

1). Ich versuche Elemente zu drucken, die in sind b aber nicht in a

2). Ich möchte die oben gezeigten Listen so vergleichen, dass nur die ersten drei Elemente einzelner Tupel verglichen werden, unabhängig davon, ob das letzte Element dieses Tupels nicht übereinstimmt, d. H. 37, 38, 39.... Also in obigem Fall möchte ich, dass meine Antwort so aussieht:

result = [(18,223,70,37)]

So wie Sie in diesem Fall den Algorithmus sehen könnenwürde die letzte Zahl oder das vierte Element beim Vergleichen einzelner Tupel völlig ignorieren. Daher möchte ich, dass, wenn die ersten drei Elemente von Tupeln übereinstimmen, vorhergesagt werden kann, dass es keinen Unterschied gibt, obwohl das vierte Element möglicherweise dasselbe ist oder nicht.

Was ich versucht habe:

Abgesehen von der Suche nach Lösungen wollte ich nur versuchen set(b_value)-set(a_value) Ansatz. Aber ich wusste, dass es nicht funktioniert, da das Ergebnis so aussieht:

set([(18, 613, 70, 42), (18, 448, 70, 40), (18, 548, 70, 41), (18, 299, 70, 38), (18, 323, 70, 39), (18, 223, 70, 37)])

Dies ist ein ziemlich offensichtliches Ergebnis, da das letzte Element aller Tupel nicht übereinstimmt. Daher sagt diese Methode alle Tupel als nicht übereinstimmend voraus.

BEARBEITEN: Ich möchte den Wert des 4. Elements in meinem Ergebnis beibehalten, daher ist das Löschen aller 4. Elemente in allen Tupeln und das Vergleichen nicht möglich.

Antworten:

2 für die Antwort № 1

Erstellen Sie eine Menge für die erste Liste, die die Tupel ohne das letzte Element enthält. Sie können eine zweite Schleife machen b um diejenigen zu sammeln, deren erste Elemente nicht im Set sind:

a_set = {t[:-1] for t in a}
result = [t for t in b if t[:-1] not in a_set]

Algorithmisch bedeutet dies den gleichen Arbeitsaufwand wie das Konvertieren von beiden in Mengen und das Erzeugen einer Mengenunterschiede.

Demo:

>>> a = [(18, 299, 70, 33), (18, 323, 70, 34),
... (18, 448, 70, 35), (18, 548, 70, 36), (18, 613, 70, 37)]
>>> b = [(18, 223, 70, 37), (18, 299, 70, 38),
... (18, 323, 70, 39), (18, 448, 70, 40), (18, 548, 70, 41), (18, 613, 70, 42)]
>>> a_set = {t[:-1] for t in a}
>>> [t for t in b if t[:-1] not in a_set]
[(18, 223, 70, 37)]