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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Anna_Prinetsol
User
Beiträge: 4
Registriert: Dienstag 5. März 2019, 11:32

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
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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
Zuletzt geändert von ThomasL am Freitag 3. Mai 2019, 15:29, insgesamt 1-mal geändert.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Anna_Prinetsol
User
Beiträge: 4
Registriert: Dienstag 5. März 2019, 11:32

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?
Anna_Prinetsol
User
Beiträge: 4
Registriert: Dienstag 5. März 2019, 11:32

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 :)
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten