Seite 1 von 1

Wie fülle ich zweidimensionale Arrays mit Werten, die ich aus der for-Schleife bekomme?

Verfasst: Freitag 3. Mai 2019, 14:15
von Anna_Prinetsol
Liebe Leute,
mein Problem hängt mit Listen , bzw.mit zweidimensionalen Arrays zusammen. Ich verwende Arrays bei meiner kleinen Anwendung an mehreren Stellen, und hab die Erfahrung, dass sie genauso funktionieren wie in anderen Programmiersprechen, ich kann sie gut anwenden. Wie ich sie jetzt verwenden möchte, da hat aber Python höchstwahrscheinlich eine Eigenschaft/Logik/Vorgehensweise, die für mich noch unbekannt ist.

Ich lese ein File ein, dann suche ich nach bestimmten Zeilen im File. Das File wird zeilenweise eingelesen, und es wird mit einer for-Schleife bis zum Ende durchgeblättert. Immer wenn ich eine Zeile finde, nach der ich suche, zerlege ich sie mit split() , und ich speichere die dann in eine Liste. Diese Liste speichere ich von dort weg (in ein zweidimensionales Array), weil beim nächsten Durchlauf der for-Schleife neue Werte reinkommen werden. Das geht aber mit meinem Script insofern schief, dass wenn da neue Werte reinkommen, dann ändern sich auch die Werte der früher weggespeicherten Listen nachträglich. Als würde Python statt die Werte einfach nur die Links auf die Werte speichern, und wenn sie sich ändern, dann ändern sich die Werte auch. Das will ich aber nicht. Ich möchte die Werte speichern. Wie mache ich es richtig?

(Im Script sind die Inhalte so weit es geht vereinfacht, und die Schreibweise des Scripts so weit es geht übersichtlich. Ich weiß, dass es einfacher, kürzer, eleganter auch ginge, wollte nur selber auch so debuggen, bzw. euch so herzeigen, weil es so vielleicht eindeutiger ist.)

Code: Alles auswählen

for AktuelleZeile in ReadFile:
	w_zeilenNr += 1 

	if 'SUCHSTRING' in AktuelleZeile:
		AktuelleZeile_Liste = AktuelleZeile.split(';')
	
		for i in range(0, len(AktuelleZeile_Liste)):
			if 'A' in AktuelleZeile_Liste[i]:
				A_inList = get_value(AktuelleZeile_Liste[i])
			if 'B' in AktuelleZeile_Liste[i]:
				B_inList = get_value(AktuelleZeile_Liste[i])
			if 'C' in AktuelleZeile_Liste[i]:
				C_inList = get_value(AktuelleZeile_Liste[i])
			if 'D' in AktuelleZeile_Liste[i]:
				D_inList = get_value(AktuelleZeile_Liste[i])
			if 'E' in AktuelleZeile_Liste[i]:
				E_inList = get_value(AktuelleZeile_Liste[i])
			if 'F' in AktuelleZeile_Liste[i]:
				F_inList = get_value(AktuelleZeile_Liste[i])
			if 'G' in AktuelleZeile_Liste[i]:
				G_inList = get_value(AktuelleZeile_Liste[i])
          
		AktuelleZeile_Liste_Kopie[0] = A_inList      
		AktuelleZeile_Liste_Kopie[1] = B_inList
		AktuelleZeile_Liste_Kopie[2] = C_inList
		AktuelleZeile_Liste_Kopie[3] = D_inList
		AktuelleZeile_Liste_Kopie[4] = E_inList
		AktuelleZeile_Liste_Kopie[5] = F_inList
		AktuelleZeile_Liste_Kopie[6] = G_inList

		if ZeileNr == 1:
       		Liste_Nr1 = AktuelleZeile_Liste_Kopie
			MeinArray.append(Liste_Nr1)
		if ZeileNr == 2:
       		Liste_Nr2 = AktuelleZeile_Liste_Kopie
			MeinArray.append(Liste_Nr2)
		if ZeileNr == 3:
	       	Liste_Nr3 = AktuelleZeile_Liste_Kopie
			MeinArray.append(Liste_Nr3)
Ergebnis nach dem Durchlauf mit ZeileNr == 1
MeinArray = [['2', '4', '6', '8', '10', '12', '14', '16']]

Ergebnis nach dem Durchlauf mit ZeileNr == 2
MeinArray = [['3', '6', '9', '12', '15', '18', '21', '24'], ['3', '6', '9', '12', '15', '18', '21', '24']]

Ergebnis nach dem Durchlauf mit ZeileNr == 3
MeinArray = [['4', '8', '12', '16', '20', '24', '28', '32'], ['4', '8', '12', '16', '20', '24', '28', '32'], ['4', '8', '12', '16', '20', '24', '28', '32']]

Mein Ziel wäre ja, dass ich am Ende Folgendes bekomme:
MeinArray = [['2', '4', '6', '8', '10', '12', '14', '16'], ['3', '6', '9', '12', '15', '18', '21', '24'], ['4', '8', '12', '16', '20', '24', '28', '32']]

Beim Debuggen sehe ich aber, dass wenn der Script mit 'ZeileNr == 2' durchläuft und zur Zeile 'AktuelleZeile_Liste_Kopie[0] = A_inList' kommt, dann ändert sich der Wert 'meinArray[0][0]' sofort auf '3', also 'meinArray' schaut sofort so aus: 'MeinArray = [['3', '4', '6', '8', '10', '12', '14', '16']]' , also der erste Wert ändert sich sofort von 2 auf 3. Das heißt, ich gebe da nur die Links weiter, und nicht die konkrete Werte.
Wie könnte ich den Script so ändern, dass es das tut, was ich damit erreichen will? :)

Vielen Dank für eure Tipps! :)
Liebe Grüße, Anna

Re: Wie fülle ich zweidimensionale Arrays mit Werten, die ich aus der for-Schleife bekomme?

Verfasst: Freitag 3. Mai 2019, 14:47
von __deets__
Namen in Python sind nur das - Namen. Sie bennen ein Objekt, aber sie machen sonst damit nichts. Das was du also Kopie nennst ist eben nur eine weitere Referenz.

Es gibt eine Reihe von Moeglichkeiten damit umzugehen. Das fuer deinen Fall kuerzeste ist einfach die Liste eben wirklich zu kopieren.

Code: Alles auswählen

AktuelleZeile_Liste_Kopie[0] = list(A_inList )
Alternativ erledigt das get_value schon, das kennt hier jetzt ja keiner. Damit sind dann die Rueckgabewerte schon eigene Listen-Objekte.

Allerdings ist der Code den du da zeigst insgesamt SEHR unidiomatisch. Man findet mit Python wahrscheinlich auch eine deutlich elegantere Loesung - dazu muesstest du allerdings etwas mehr ausholen, was genau da passieren soll.

Ein Tipp ist zB schonmal die Verwendung des csv-Moduls, mit dem du dir das einlesen der Datei einfacher machst.

Re: Wie fülle ich zweidimensionale Arrays mit Werten, die ich aus der for-Schleife bekomme?

Verfasst: Freitag 3. Mai 2019, 15:25
von ThomasL
siehe das Code Beispiel von __deets__

Edit: der Post auf den ich antworten wollte wurde gelöscht
Edit2: und taucht jetzt unter mir auf.... :D

Re: Wie fülle ich zweidimensionale Arrays mit Werten, die ich aus der for-Schleife bekomme?

Verfasst: Freitag 3. Mai 2019, 15:28
von Anna_Prinetsol
Danke für deine Tipps! ich schaue mir an, was der csv-Modul tut, und verwende das, wenn es tatsächlich das ist, worum es da inhaltlich geht.
Ich hab da extra geschrieben, dass es mir klar ist, dass der Code in der Form sehr stupid ausschaut :) Das mache ich immer, wenn ich einen Fehler habe, den ich lange nicht finde. Somit ist es ausgeschlossen, dass ich elegantere Lösungen falsch benutze, und das die Fehlerquelle ist. Hier ist es ausgeschlssen :)
get_value hab ich zufällig drinnen gelassen im Code (sonst habe ich ihn sehr vereinfacht, eben damit die Problemstellung klar ist). get_value tut aber nichts für uns Relevantes. (Es steht da 'XYZ=1', und gibt '1' zurück)
Du schreibst, dass es viele Möglichkeiten gibt, und unter anderem auch "die Liste wirklich zu kopieren". Hilf mir bitte, wie ginge das?

Re: Wie fülle ich zweidimensionale Arrays mit Werten, die ich aus der for-Schleife bekomme?

Verfasst: Freitag 3. Mai 2019, 15:30
von Anna_Prinetsol
Ja, Dankeschön, ThomasL! Ich habe gerade bemerkt, dass es kein Zitat aus meinem Code gewesen ist, sondern ein Beispiel für das, was er schreibt!

Und Dankeschön _deets_ ! Dieses Problem ist gelöst, jetzt kann ich mich um den Code kümmern! :) Next step: csv Modul checken! Danke :)

Re: Wie fülle ich zweidimensionale Arrays mit Werten, die ich aus der for-Schleife bekomme?

Verfasst: Freitag 3. Mai 2019, 16:20
von __blackjack__
@Anna_Prinetsol: Es geht nicht um elegant und unelegant sondern um idiomatisch und unidiomatisch, also letztlich um: das drückt man so aus oder das drück man so nicht aus. Und dabei geht es nicht um Kosmetik/Optik sondern unter anderem auch um Fehler zu vermeiden in dem man einfachereren und verständlicheren Code schreibt. Das ist zum einen weniger fehleranfällig und zum anderen findet man Fehler schneller.