2016-04-04 14 views
1

Gibt es eine Möglichkeit in Python 2 Sequenzen in Listen zu vergleichen, auch wenn sie nicht normalisiert sind (ich denke, das ist das richtige Wort). Zum Beispiel:Vergleichen Sequenzen Python

a = [1,1,2,3,3,1,5] 
b = [2,3,3,1,5,1,1] 
c = [1,1,1,2,3,3,5] 

a == b sollte return true, da sie die gleiche Sequenz gerade von einem anderen Ausgangspunkt enthalten.

c == a sollte Falsch zurückgeben als obwohl sie dieselben Elemente enthalten, sie die gleiche Sequenz nicht

Das einzige, was ich eher unelegant kann Sache enthalten. Ich würde 2 Listen vergleichen und wenn sie nicht gleich sind, verschiebe das letzte Element der Liste nach vorne und vergleiche es erneut. Wiederholen Sie dies, bis ich die gesamte Liste einmal verschoben habe. Allerdings werde ich mit einigen sehr großen Listen arbeiten, so dass dies sehr ineffizient sein wird

Antwort

1

Dies könnte als Schaltelement effizienter sein:

>>> a = [1, 1, 2, 3, 3, 1, 5] 
>>> b = [2, 3, 3, 1, 5, 1, 1] 
>>> c = [1, 1, 1, 2, 3, 3, 5] 
>>> astr, bstr, cstr = ["".join(map(str, x)) for x in (a, b, c)] 
>>> astr in bstr*2 
True 
>>> cstr in astr*2 
False 

Was sie tut, ist im Grunde join die Listen in Strings und prüfen, ob Die erste Zeichenfolge ist in der anderen "verdoppelt" enthalten.
Die Verwendung von Strings ist wahrscheinlich die schnellste und sollte für einfache Fälle wie im OP funktionieren. Als allgemeinerer Ansatz können Sie die gleiche Idee auf Listen-Slices anwenden, z. B.

+0

Danke, Lösung funktioniert viel schneller –