it-swarm.com.de

Überprüfen Sie, ob zwei ungeordnete Listen gleich sind

Ich suche nach einer einfachen (und schnellen) Möglichkeit, um festzustellen, ob zwei ngeordnete Listen dieselben Elemente enthalten:

Zum Beispiel:

['one', 'two', 'three'] == ['one', 'two', 'three'] :  true
['one', 'two', 'three'] == ['one', 'three', 'two'] :  true
['one', 'two', 'three'] == ['one', 'two', 'three', 'three'] :  false
['one', 'two', 'three'] == ['one', 'two', 'three', 'four'] :  false
['one', 'two', 'three'] == ['one', 'two', 'four'] :  false
['one', 'two', 'three'] == ['one'] :  false

Ich hoffe, dies ohne Verwendung einer Karte zu tun.

224
Paul

Python hat einen eingebauten Datentyp für eine ungeordnete Sammlung von (hashbaren) Dingen, genannt set. Wenn Sie beide Listen in Mengen konvertieren, wird der Vergleich ungeordnet.

set(x) == set(y)

Dokumentation zu set


BEARBEITEN: @mdwhatcott weist darauf hin, dass Sie nach Duplikaten suchen möchten. set ignoriert diese Angaben, sodass Sie eine ähnliche Datenstruktur benötigen, die auch die Anzahl der Elemente in jeder Liste verfolgt. Dies nennt man Multiset ; die beste Annäherung in der Standardbibliothek ist ein collections.Counter :

>>> import collections
>>> compare = lambda x, y: collections.Counter(x) == collections.Counter(y)
>>> 
>>> compare([1,2,3], [1,2,3,3])
False
>>> compare([1,2,3], [1,2,3])
True
>>> compare([1,2,3,3], [1,2,2,3])
False
>>> 
395
Katriel

Wenn die Elemente immer fast wie in Ihrem Beispiel sortiert sind, sollte das eingebaute .sort() ( timsort ) schnell sein:

>>> a = [1,1,2]
>>> b = [1,2,2]
>>> a.sort()
>>> b.sort()
>>> a == b
False

Wenn Sie nicht an Ort und Stelle sortieren möchten, können Sie sorted() verwenden.

In der Praxis kann es immer schneller sein als collections.Counter() (obwohl O(n) asymptotisch besser ist als O(n*log(n)) für .sort()). Messe Es; Falls es wichtig ist.

65
jfs
sorted(x) == sorted(y)

Kopieren von hier: Überprüfen Sie, ob zwei ungeordnete Listen gleich sind

Ich denke, das ist die beste Antwort auf diese Frage, weil

  1. Es ist besser, als Zähler zu verwenden, wie in diese Antwort gezeigt
  2. x.sort () sortiert x, was ein Nebeneffekt ist. sortiert (x) gibt eine neue Liste zurück.
17
Enzam Hossain

Sie möchten sehen, ob sie dieselben Elemente enthalten, interessieren sich jedoch nicht für die Reihenfolge.

Sie können ein Set verwenden:

>>> set(['one', 'two', 'three']) == set(['two', 'one', 'three'])
True

Das Set-Objekt selbst enthält jedoch nur eine Instanz jedes eindeutigen Werts und behält die Reihenfolge nicht bei.

>>> set(['one', 'one', 'one']) == set(['one'])
True

Wenn das Verfolgen von Duplikaten/Längen wichtig ist, möchten Sie wahrscheinlich auch die Länge überprüfen:

def are_eq(a, b):
    return set(a) == set(b) and len(a) == len(b)
14
Matimus

wenn Sie die Auflistungsbibliothek nicht verwenden möchten, können Sie immer so vorgehen: Wenn a und b Ihre Listen sind, wird im Folgenden die Anzahl der übereinstimmenden Elemente zurückgegeben (dies berücksichtigt die Bestellung).

sum([1 for i,j in Zip(a,b) if i==j])

Deshalb,

len(a)==len(b) and len(a)==sum([1 for i,j in Zip(a,b) if i==j])

wird True sein, wenn beide Listen gleich sind, dieselben Elemente und in derselben Reihenfolge enthalten. False ansonsten.

Sie können die Vergleichsfunktion also wie die erste Antwort oben definieren, jedoch ohne die Auflistungsbibliothek.

compare = lambda a,b: len(a)==len(b) and len(a)==sum([1 for i,j in Zip(a,b) if i==j])

und

>>> compare([1,2,3], [1,2,3,3])
False
>>> compare([1,2,3], [1,2,3])
True
>>> compare([1,2,3], [1,2,4])
False
4
fiacobelli

Eine Antwort auf die obige Frage lautet:

lassen Sie die beiden Listen Liste1 und Liste2 sein, und Ihre Anforderung ist es, sicherzustellen, dass zwei Listen die gleichen Elemente haben. Dann ist für mich Folgendes der beste Ansatz:

if ((len(list1) == len(list2)) and
   (all(i in list2 for i in list1))):
    print 'True'
else:
    print 'False'

Der obige Code funktioniert nach Ihren Wünschen, d. H. Ob alle Elemente von Liste1 in Liste2 sind und umgekehrt.

Wenn Sie jedoch nur überprüfen möchten, ob alle Elemente von Liste1 in Liste2 vorhanden sind oder nicht, müssen Sie nur den folgenden Code verwenden:

if all(i in list2 for i in list1):
    print 'True'
else:
    print 'False'

Der Unterschied ist, dass der spätere Wert True ausgibt, wenn list2 einige zusätzliche Elemente zusammen mit allen Elementen von list1 enthält. Mit einfachen Worten wird sichergestellt, dass alle Elemente von Liste1 in Liste2 vorhanden sein sollten, unabhängig davon, ob Liste2 einige zusätzliche Elemente enthält oder nicht.

3
Pabitra Pati

Was ist mit der Zeichenfolgendarstellung der Listen und deren Vergleich?

>>> l1 = ['one', 'two', 'three']
>>> l2 = ['one', 'two', 'three']
>>> l3 = ['one', 'three', 'two']
>>> print str(l1) == str(l2)
True
>>> print str(l1) == str(l3)
False
3
sagi

Unter der Annahme, dass Sie bereits wissen, dass Listen gleich groß sind, garantiert Folgendes genau dann True, wenn zwei Vektoren genau gleich sind (einschließlich der Reihenfolge).

functools.reduce(lambda b1,b2: b1 and b2, map(lambda e1,e2: e1==e2, listA, ListB), True)

Beispiel:

>>> from functools import reduce
>>> def compvecs(a,b):
...     return reduce(lambda b1,b2: b1 and b2, map(lambda e1,e2: e1==e2, a, b), True)
... 
>>> compvecs(a=[1,2,3,4], b=[1,2,4,3])
False
>>> compvecs(a=[1,2,3,4], b=[1,2,3,4])
True
>>> compvecs(a=[1,2,3,4], b=[1,2,4,3])
False
>>> compare_vectors(a=[1,2,3,4], b=[1,2,2,4])
False
>>> 
3
Arnon Sela