Seite 1 von 1
Listen slicing
Verfasst: Samstag 17. Oktober 2015, 18:34
von gerald123
Ich bekommen bei folgendem Beispiel nicht das erwartet Ergebnis:
L = [1,2,3,4,5,6]
L[1:3]= [99]
Das Ergebnis ist: [1, 99, 4, 5, 6]
Erwartet hätte ich: [1,99,99,99,5,6]
Vielen Dank für eure Erklärung

Re: Listen slicing
Verfasst: Samstag 17. Oktober 2015, 18:44
von cofi
Nun, du ersetzt einen Listenteil mit einer Singleton Liste, warum sollte daraus ploetzlich eine dreielementige Liste werden?
Kurze Antwort: Deine Erwartung ist nunmal falsch.
Laengere Antwort: Weisst du an einen Slice zu, muss auf der rechten Seite ein Iterable sein, das an dessen Stelle eingefuegt wird:
Code: Alles auswählen
In [1]: L = range (1, 6)
In [2]: L[1:3] = 99
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-70adb66d4273> in <module>()
----> 1 L[1:3] = 99
TypeError: can only assign an iterable
In [3]: L[1:3] = [99]
In [4]: L
Out[4]: [1, 99, 4, 5]
Deine Erwartung wuerde aber erfordern, dass du auch einzelne Elemente so einfuegen kannst. Warum _diese_ Semantik? Weil man nunmal viel haeufiger das implementierte Verhalten braucht als das, das du erwartest

Noch dazu kann man letzteres ganz einfach emulieren:
Code: Alles auswählen
In [5]: L = range (1, 6)
In [6]: L[1:3] = [42] * 3
In [7]: L
Out[7]: [1, 42, 42, 42, 4, 5]
Re: Listen slicing
Verfasst: Samstag 17. Oktober 2015, 20:43
von MagBen
Probier's mal mit Numpy
Code: Alles auswählen
import numpy as np
L = np.array([1,2,3,4,5,6])
L[1:3] = 99
print L # [ 1 99 99 4 5 6]
Beim slicing hat man bis zu drei Parameter:
L[ von
einschließlich : bis
ausschließlich : Schrittweite]
Wird ein Parameter weggelassen, so wird ein Defaultwert genommen
von: Anfang
bis: Ende
Schrittweite: 1
Interessant wird's mit negativen Parametern:
Code: Alles auswählen
print L[::-1] # [ 6 5 4 99 99 1]
print L[:-3] # [ 1 99 99]
oder mit mehrdimensionalen Arrays
Code: Alles auswählen
A = np.arange(24)
A.shape = 4,6
print A
#[[ 0 1 2 3 4 5]
# [ 6 7 8 9 10 11]
# [12 13 14 15 16 17]
# [18 19 20 21 22 23]]
print A[:,1] # 2.Spalte
# [ 1 7 13 19]
print A[1:3,2:4]
# [[ 8 9]
# [14 15]]
Re: Listen slicing
Verfasst: Sonntag 18. Oktober 2015, 10:24
von BlackJack
@gerald123: Dein Beispiel ist glaube ich falsch gewählt, oder hättest Du tatsächlich erwartet das die Operation *zwei* Elemente durch *drei* ersetzt und die Liste damit ein Element länger wird‽