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‽