Seite 1 von 1
Liste/Tupel modifizieren
Verfasst: Dienstag 19. September 2017, 13:37
von SoB
Hallo, ich bin python-Einsteiger und hoffe ihr seid nachsichtig mit mir

Ich möchte folgendes tun. Ich habe eine Liste
Code: Alles auswählen
datalist=[(0.0, 0.0, 1000.0), (-0.5, -0.5, 950.0), (0.5, -0.5, 850.0), (-0.5, 0.5, 850.0), (0.5, 0.5, 950.0)]
und möchte diese folgendermaßen modifizieren: Die ersten beiden Einträge in den einzelnen Tupel sollen jeweils mit 100 multipliziert werden, sodass
Code: Alles auswählen
datalist_mod=[(0.0, 0.0, 1000.0), (-50, -50, 950.0), (50, -50, 850.0), (-50, 50, 850.0), (50, 50, 950.0)]
.
In Matlab würde ich es als Matrix schreiben und so lösen:
aber wie geht das mit einer Liste in Python? Ich fürchte, ich habe das Konzept noch nicht richtig durchschaut. Warum ist z.B. "datalist[:][0]=datalist[0][:]". Beides gibt mir das erste Tupel in der Liste datalist. Intuitiv hätte ich erwartet, dass eins von beiden die jeweils ersten Einträge der Tupel zurückgibt.
Re: Liste modifizieren
Verfasst: Dienstag 19. September 2017, 14:01
von __deets__
In Python machst du mit
liste[:]
eine Kopie der ganzen Liste, und davon das erste Element ist dann natuerlich (0, 0, 100).
liste[0][:]
ist dann das erste Element der Liste, und davon eine Kopie. Also gleich dem ersten Ausdruck.
Wenn du von matlab kommst, dann wirst du sicher mit NumPy arbeiten wollen/muessen. Und damit sollte dein Problem so zu loesen sein:
Code: Alles auswählen
>>> import numpy as np
>>> a = np.array(datalist)
>>> a.shape
(5, 3)
>>> a[:,0:2] * 100
array([[ 0., 0., 1000.],
[ -50., -50., 950.],
[ 50., -50., 850.],
[ -50., 50., 850.],
[ 50., 50., 950.]])
Re: Liste/Tupel modifizieren
Verfasst: Dienstag 19. September 2017, 14:58
von SoB
Vielen Dank für die Erklärung. Ich denke wohl noch zu sehr "matlab-mäßig". In numpy werde ich mich mal einarbeiten, das klingt interessant für mich. Kurze Rückfrage zu dem Code: Wenn ich
Code: Alles auswählen
import numpy as np
datalist=[(0.0, 0.0, 1000.0), (-0.5, -0.5, 950.0), (0.5, -0.5, 850.0),
(-0.5, 0.5, 850.0), (0.5, 0.5, 950.0)]
a = np.array(datalist)
a[:,0:2] * 100
ausführe liefert das bei mir etwas anderes, nämlich:
Code: Alles auswählen
array([[ 0.0, 0.0],
[-50.0, -50.0],
[ 50.0, -50.0],
[-50.0, 50.0],
[ 50.0, 50.0]], 'd')
Es fehlt also die dritte Komponente.
Re: Liste/Tupel modifizieren
Verfasst: Dienstag 19. September 2017, 15:10
von __deets__
Ah, my bad. Ich hatte zuerst in-place multipliziert. Das solltest du auch tun, dann musst du aber entweder vorher eine Kopie machen falls du die Original Daten noch brauchst, oder eben nicht.
Also
Re: Liste/Tupel modifizieren
Verfasst: Dienstag 19. September 2017, 15:54
von SoB
Ach ja, so geht's, danke

Re: Liste/Tupel modifizieren
Verfasst: Dienstag 19. September 2017, 16:19
von bwbg
Fix könnte man das mittels list-comprehension zusammen mit tuple-unpacking lösen:
[codebox=pycon file=Unbenannt.txt]
>>> data = [(0.0, 0.0, 1000.0), (-0.5, -0.5, 950.0), (0.5, -0.5, 850.0)]
>>> [(x * 100, y * 100, z) for x, y, z in data]
[(0.0, 0.0, 1000.0), (-50.0, -50.0, 950.0), (50.0, -50.0, 850.0)]
[/code]
Alternativ könnte man über eine generator-expression nachdenken, wenn die Daten (als Sequence) allzu umfangreich werden.