Listen slicing

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
gerald123
User
Beiträge: 36
Registriert: Donnerstag 10. September 2015, 12:10

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 :)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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]
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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]]
a fool with a tool is still a fool, www.magben.de, YouTube
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‽
Antworten