Seite 1 von 1

Array vergleichen funktioniert nicht!

Verfasst: Samstag 30. April 2011, 10:58
von waltecp3
Hallo liebe python-Gemeinde,

Also ich bin ziemlich neu in python, und verwende python in Verbindung mit sagemath. Nun hab ich folgendes Problem. Ich hab eine Liste, das ein Output einer Funktion ist. Sprich: Es ist wiefolgt aufgebaut = [1,0,0,1,0,0]. Nun möchte ich gerne die Periodenlänge der Liste herausfinden, in dem Fall wäre das ja 3, weil e sich nach 3 Stellen wiederholt.
Ich dachte mir, das ich die Liste einfach kopiere, sodass ich sie 2 mal habe, und dann in einer for-schleife die Werte um eins nach links durchschiebe(der Wert der links "rausfällt" wird rechts wieder in die Liste gesteckt), und dieses solange wiederhole bis die Listen wieder gleich sind. Also ein Beispiel:
Liste1 = [1,0,0,1,0,0]
Liste2 = [1,0,0,1,0,0]

1. Left-Shift:

Liste1 = [1,0,0,1,0,0]
Liste2 = [0,0,1,0,0,1] -> nicht gleich

2.Left-Shift:

Liste1 = [1,0,0,1,0,0]
Liste2 = [0,1,0,0,1,0] -> nicht gleich

3. Left-Shift:
Liste1 = [1,0,0,1,0,0]
Liste2 = [1,0,0,1,0,0] -> gleich -> Periodenlänge = 3.

So nun hab ich folgendes Problem: Jedes mal wenn ich den left-shift mittels einer selbstgeschriebenen Funktion durchführe, werden beide Listen nach links geschoben, und nicht nur die eine! Ich weiß wirklich nicht woran es liegt. Ich hab den relevanten Code mal unten dran gehangen. Ich weiß das ist vielleicht nicht sehr gut programmiert und geht sicherlich auch noch effizienter(Tipps? ;-) )

Code: Alles auswählen

def lshift(array):
	temp = 0
	temp = array[0]
	for i in range (1,len(array)):
		array[i-1] = array[i]
	array[(len(array)-1)] = temp
	return array

output2 = output
for i in range(len(output)):
	output = lshift(output)
	if (output == output2):
		print i
		break
Ich bin über jede Hilfe dankbar :-)

Re: Array vergleichen funktioniert nicht!

Verfasst: Samstag 30. April 2011, 11:04
von EyDu
Hallo und willkommen im Forum!

Der Grund ist eigentlich ganz einfach: Wenn etwas in Python an einen Namen gebunden wird, dann wird keine Kopie erzeugt, sondern lediglich eine Kopie der Referenz. Bei unveränderlichen Objekten, wie Strings oder Integern, macht das keinen Unterschied zur Kopie. Bei Veränderlichen Objekten, wie Listen oder Dictionaries, hingegen, arbeitest du auf dem selben Objekt, welches lediglich an zwei Namen gebunden ist. Der einfachste Weg ist es, sich explizit eine Kopie zu erzeugen. Im falle der Liste sieht das so aus:

Code: Alles auswählen

original = [1, 2, 4, 8]
copy = original[:]
Damit hast du nun zwei unterschiedliche Listen. Natürlich gilt weiterhin, für die Elemente in der Liste, dass nur die Referenezen kopiert wurden. Das ist in den meisten Fällen allerdings so gewollte.

Sebastian

Re: Array vergleichen funktioniert nicht!

Verfasst: Samstag 30. April 2011, 11:08
von waltecp3
Das hätte mir ca. 6 Stunden Zeit und Nerven sparen können.
Ich bin das nicht gewohnt aus anderen Programmiersprache (z.B. PHP), das keine Kopie erstellt wird :)
Vielen vielen Dank! Nun funktionierts einwandfrei!

Re: Array vergleichen funktioniert nicht!

Verfasst: Samstag 30. April 2011, 11:30
von pillmuncher
waltecp3 hat geschrieben:Ich bin das nicht gewohnt aus anderen Programmiersprache (z.B. PHP), das keine Kopie erstellt wird :)
Dann solltest Du ein gutes Python-Buch zur Hand nehmen, in dem diese, und andere, Dinge erklärt werden. ZB., dass Listen in Python eben Listen sind und keine Arrays. Oder dass man eine Liste in Python folgendermassen links-rotiert:

Code: Alles auswählen

def rotl(alist):
   return alist[1:] + alist[:1]
Gruß,
Mick.