list slicing für das ersetzen eines indexes verwenden?

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
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Hallo,

gestern ist mir durch einen kleinen Fehler aufgefallen, dass es möglich ist einen Index zu ersetzen indem man ähnlich wie bei einem dictionary vorgeht:

Code: Alles auswählen

>>> liste = [1]
>>> liste[0] = 2
>>> liste
[2]
Bisher habe ich für soetwas "pop" und "insert" verwendet, aber nun tendiere ich doch eher dazu, das slicing zu verwenden. Aber warum ich überhaupt hier schreibe.. sollte ich das? Denn ich habe nichts "offizielles" darüber gefunden. Hab auch extra nochmal im Tutorial nachgesehen. Und bevor das jetzt irgendwas ist, was halt nur "zufällig" funktioniert...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, das ist kein Zufall, sondern wohldefinierte Semantik.

Code: Alles auswählen

In [1]: a = range(5)

In [2]: a.__setitem__?
Type:		method-wrapper
Base Class:	<type 'method-wrapper'>
String Form:	<method-wrapper '__setitem__' of list object at 0x22ae320>
Namespace:	Interactive
Docstring:
    x.__setitem__(i, y) <==> x[i]=y


In [3]: a.__setitem__(3, "x")

In [4]: a
Out[4]: [0, 1, 2, 'x', 4]
Kannst du also ohne weiteres nutzen ;)
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Danke, dann ist ja gut :P
BlackJack

@Gremlin: Im Tutorial steht das aber: http://docs.python.org/tutorial/introduction.html#lists

Und da steht auch wie sich das bei Slicing verhält, was Du zwar ansprichst aber nicht zeigst. Und wenn Du das mit Slicing wusstest, ist es schon sehr komisch das Du nicht darauf gekommen bist es mit nur mit einem Index anstelle der Slice-Syntax zu versuchen. Oder bezeichnest Du `pop()` und `insert()` irrtümlich als Slicing?
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Gremlin hat geschrieben:Denn ich habe nichts "offizielles" darüber gefunden. Hab auch extra nochmal im Tutorial nachgesehen. Und bevor das jetzt irgendwas ist, was halt nur "zufällig" funktioniert...
Ich glaub du hast es einfach übersehen...
http://docs.python.org/tutorial/introduction.html#lists

Code: Alles auswählen

Unlike strings, which are immutable, it is possible to change individual elements of a list:

>>> a
['spam', 'eggs', 100, 1234]
>>> a[2] = a[2] + 23
>>> a
['spam', 'eggs', 123, 1234]
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Ja, habs wohl übersehen. :oops:

@BlackJack
Ich weiß nicht so recht worauf du hinaus möchtest. Unter Slicing verstehe ich alles was mit eckigen Klammern auf Objekten angewendet werden kann. Ist das falsch?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Gremlin hat geschrieben:Ich weiß nicht so recht worauf du hinaus möchtest. Unter Slicing verstehe ich alles was mit eckigen Klammern auf Objekten angewendet werden kann. Ist das falsch?
Kann man sagen: Ja, Slices haben eckige Klammern, aber noch dazu einen Doppelpunkt. Machen wir mal direkt weiter mit den Dunder Methods:
Python unterscheidet zwischen dem oben gezeigten `__(set|get)item__` und `__(set|get)slice`:

Code: Alles auswählen

 In [1]: a = range(5)

In [2]: a.__getslice__?
Type:		method-wrapper
Base Class:	<type 'method-wrapper'>
String Form:	<method-wrapper '__getslice__' of list object at 0x220b320>
Namespace:	Interactive
Docstring:
    x.__getslice__(i, j) <==> x[i:j]
    
    Use of negative indices is not supported.


In [3]: a.__setslice__?
Type:		method-wrapper
Base Class:	<type 'method-wrapper'>
String Form:	<method-wrapper '__setslice__' of list object at 0x220b320>
Namespace:	Interactive
Docstring:
    x.__setslice__(i, j, y) <==> x[i:j]=y
    
    Use  of negative indices is not supported.
Antworten