Seite 1 von 1

Slicing & List

Verfasst: Freitag 6. November 2009, 14:36
von Brain
Hallo zusammen,

ich habe eine Frage zu dem Typ List und Slicing:
Wieso funktioniert folgender Code?

Code: Alles auswählen

lst = ['A', 'B', 'C', 'D', 'E']
lst[5:5] = 'F'
Weshalb kann das 'F' so hinzufügt werden, aber nicht mit dem folgenden Code?

Code: Alles auswählen

lst = ['A', 'B', 'C', 'D', 'E']
lst[5] = 'F'          # IndexError: list assignment index out of range
Wie funktioniert das?

Viele Grüße

Verfasst: Freitag 6. November 2009, 14:44
von mkesper
Schau mal ins Tutorial.

Verfasst: Freitag 6. November 2009, 14:46
von jbs
du suchst list.append

warum das andere geht kann ich dir nicht direkt sagen, aber python fügt da anscheinend einfach ein element hinten dran.

da deine liste keine 6 elemente besitzt kannst du auch nicht das "f" an diese position binden

Verfasst: Freitag 6. November 2009, 14:49
von numerix
jbs hat geschrieben:warum das andere geht kann ich dir nicht direkt sagen, aber python fügt da anscheinend einfach ein element hinten dran.
Nein, angefügt wird nichts, sieht bloß so aus.
Es wird ein Teil der Liste ersetzt durch eine neue Sequenz. Da Zeichenketten zu den Sequenztypen gehören, funktioniert das. Versuch es mal mit einer Zahl ...

Verfasst: Freitag 6. November 2009, 14:51
von numerix
mkallas hat geschrieben:Schau mal ins Tutorial.
Naja. Dann zeig doch mal, wo im Tutorial sich eine Erklärung für den ersten Fall findet.

Verfasst: Freitag 6. November 2009, 15:06
von jbs
numerix hat geschrieben:
jbs hat geschrieben:warum das andere geht kann ich dir nicht direkt sagen, aber python fügt da anscheinend einfach ein element hinten dran.
Nein, angefügt wird nichts, sieht bloß so aus.
Es wird ein Teil der Liste ersetzt durch eine neue Sequenz. Da Zeichenketten zu den Sequenztypen gehören, funktioniert das. Versuch es mal mit einer Zahl ...
Ah Danke. Nicht gerade das was ich erwartet hatte. Also quasi eine art extend?

Verfasst: Freitag 6. November 2009, 15:44
von numerix
jbs hat geschrieben:Ah Danke. Nicht gerade das was ich erwartet hatte. Also quasi eine art extend?
Nein.
Aber das kannst du durch ein paar Experimente im interaktiven Modus selbst herausfinden.

Verfasst: Freitag 6. November 2009, 15:54
von jbs
Was glaubst du was ich gemacht habe?

Mir ist schon klar, was das slicing tut. Nur bezog ich mich auf Bereiche die außerhelb der Liste lagen. Da war mir das Verhalten unklar.

Code: Alles auswählen

In [1]: l = []
In [2]: l[5:6]='alles gut'
In [3]: l
Out[3]: ['a', 'l', 'l', 'e', 's', ' ', 'g', 'u', 't']
In [4]: l = []
In [5]: l.extend('alles gut')
In [6]: l
Out[6]: ['a', 'l', 'l', 'e', 's', ' ', 'g', 'u', 't']

Verfasst: Freitag 6. November 2009, 17:21
von cofi
jbs hat geschrieben:Mir ist schon klar, was das slicing tut. Nur bezog ich mich auf Bereiche die außerhelb der Liste lagen. Da war mir das Verhalten unklar
Da wird auf die bestehenden Bereiche zurueckgegriffen:

Code: Alles auswählen

In [1]: a = [1,2,3]

In [2]: a
Out[2]: [1, 2, 3]

In [3]: a[4:99] = [1]

In [4]: a
Out[4]: [1, 2, 3, 1]
Allerdings sollte man vermeiden Slicing so zu benutzen.

Verfasst: Freitag 6. November 2009, 17:56
von gkuhl
cofi hat geschrieben:Allerdings sollte man vermeiden Slicing so zu benutzen.
Auch, weil das schnell anfängt unsinning zu werden:

Code: Alles auswählen

In [2]: a
Out[2]: [1, 2, 3]

In [3]: a[99:12] = [1]

In [4]: a
Out[4]: [1, 2, 3, 1]

Verfasst: Sonntag 8. November 2009, 02:42
von Brain
Hallo noch einmal,

zunächst Danke für Eure Antworten, aber ich verstehe immer noch nicht, weshalb das Slicing so funktioniert bzw. verstehe ich den technischen Hintergrund nicht.
Eigentlich habe ich gedacht, dass so eine Nutzung eine Exception auslösen müsste, da man auf Elemente oder Indezes zugreift, die es nicht gibt.

Kann das jemand erklären?

Wie ich übrigens dazu gekommen bin, ich habe in der Python Shell

Code: Alles auswählen

help('LISTS')
eingegeben und u.a. die folgende Zeile bekommen.

Code: Alles auswählen

``s.extend(x)``   |   same as ``s[len(s):len(s)] = x``
Grüße

Verfasst: Sonntag 8. November 2009, 09:39
von cofi
Dass sich Slicing so verhaelt wurde festgelegt, es ist _kein_ normaler Indexzugriff.
Wenn dich der Hintergrund interessiert, solltest du evtl in der Sprachreferenz nachschlagen: http://docs.python.org/reference/index.html

Verfasst: Sonntag 8. November 2009, 10:15
von numerix
Habe mir gerade mal die Doku zu slice() angesehen: http://docs.python.org/library/function ... lice#slice

Dort heißt es u.a.
For example: a[start:stop:step] or a[start:stop, i].
Das erste ist klar, aber was das zweite Beispiel angeht, so hätte ich bis eben noch behauptet, das sei keine korrekte Python-Syntax. Mir fällt zumindest kein Beispiel ein, wo das korrekt wäre. :roll:

Verfasst: Sonntag 8. November 2009, 10:36
von Darii
Doch, du kannst da beliebige Ausdrücke verwenden, ob das dann funktioniert, hängt allerdings vom verwendeten Datentyp ab. Numpy nutzt das zum Beispiel exzessiv.

Code: Alles auswählen

In [1]: import numpy

In [2]: array = numpy.array(range(100)).reshape(10, 10); array

Out[2]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
       [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
       [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
       [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
       [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
       [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])

In [3]: array[:, 1] # Auswahl der 2. Spalte

Out[3]: array([ 1, 11, 21, 31, 41, 51, 61, 71, 81, 91])

Verfasst: Sonntag 8. November 2009, 10:40
von numerix
Gibt es auch ein gültiges Beispiel, das nicht auf externe Module zurückgreift?

Edit: Das geht auf jeden Fall nicht:

Code: Alles auswählen

>>> from pprint import pprint
>>> a = [range(10*k,10*k+10) for k in xrange(10)]
>>> pprint(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, 24, 25, 26, 27, 28, 29],
 [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
 [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
 [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
 [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
 [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
 [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
 [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]]
>>> a[:,1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers

Verfasst: Sonntag 8. November 2009, 10:42
von Darii
numerix hat geschrieben:Gibt es auch ein gültiges Beispiel, das nicht auf externe Module zurückgreift?
Nicht das ich wüsste, aber einen Syntax-Error schmeißt das auch bei ``lists``s nicht.

Verfasst: Sonntag 8. November 2009, 10:49
von numerix
Darii hat geschrieben:
numerix hat geschrieben:Gibt es auch ein gültiges Beispiel, das nicht auf externe Module zurückgreift?
Nicht das ich wüsste, aber einen Syntax-Error schmeißt das auch bei ``lists``s nicht.
Hast Recht, ist ein TypeError ...