Slicing & List

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
Brain
User
Beiträge: 2
Registriert: Freitag 6. November 2009, 14:20

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
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Schau mal ins Tutorial.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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']
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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]
Brain
User
Beiträge: 2
Registriert: Freitag 6. November 2009, 14:20

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

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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:
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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])
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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
Zuletzt geändert von numerix am Sonntag 8. November 2009, 10:46, insgesamt 1-mal geändert.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ...
Antworten