it-swarm.com.de

Änderung der Listenelemente in der Schleife (Python)

Ich versuche, Elemente in einer Liste mithilfe einer for-Schleife zu ändern, aber ich erhalte eine Fehlermeldung (siehe unten). Beispielcode:

#!/usr/bin/env python
# *-* coding: utf8 *-*

data = []
data.append("some")
data.append("example")
data.append("data")
data.append("here")

for item in data:
    data[item] = "everything"

Error:

Traceback (most recent call last):
  File "./testy.py", line 11, in <module>
    data[item] = "everything"
TypeError: list indices must be integers, not str

Gibt es eine Möglichkeit, dieses Problem zu lösen?

26

Versuchen Sie es stattdessen:

for i in xrange(len(data)):
    data[i] = "everything"

Das grundlegende Problem, das Sie haben, ist, dass, wenn Sie data[i] schreiben, wobei data eine Liste ist, die i eine Ganzzahl sein muss, ein numerischer Index in der Liste. Aber in der Schleife

for item in data

item ist das eigentliche Ding, das in der Liste enthalten ist, d. h. eine Zeichenfolge, nicht der numerische Index des Dings. xrange ist ein Iterator, der Zahlen anstelle der Werte in der Liste erzeugt, sodass Sie diese verwenden können.

Eine Alternative wäre

for i, _ in enumerate(data):
    data[i] = "everything"

Die Funktion enumerate gibt Ihnen einen Iterator über Tupel der Form (index, item). Sie müssen also nur den Index nehmen und das Element vergessen. Ich bin mir nicht sicher, ob die eine oder andere Richtung (enumerate oder xrange) wesentlich schneller oder besser sein wird, da Listen ihrer Länge nach in einer Variablen gespeichert werden, sodass schnell auf sie zugegriffen werden kann, ohne durch die Listenelemente gezählt zu werden.

Wenn Sie jedoch den alten Listenwert zum Berechnen des neuen Listenwerts benötigen, ist der Weg enumerate wahrscheinlich etwas schneller, da Sie vermeiden, dass Python das Element in der Liste nachschlägt:

for i, item in enumerate(data):
    data[i] = func(item)

Diese Art von Sache wird jedoch besser als Listenverständnis ausgedrückt:

data = [func(item) for item in data]

Wenn Sie dies tun, durchläuft Python jedes Element in data, wendet die Funktion darauf an und erstellt automatisch eine neue Liste aus den Ergebnissen. Sie müssen sich also keine Sorgen darüber machen, dass das Ergebnis von func(item) an der richtigen Stelle im Verzeichnis steht Liste. Ihr ursprüngliches Beispiel könnte tatsächlich ausgedrückt werden als

data = ["everything" for item in data]
64
David Z

Auf Listenelemente wird über einen ganzzahligen Index zugegriffen, d. H. e. in Ihrem Beispiel data[1] == 'example'. Deshalb beschwert sich Python, wenn Sie eine Zeichenfolge als Suchfunktion verwenden.

Wenn Sie ein Element in einer Liste anhand seines Werts suchen möchten, können Sie data.index("value") verwenden:

data[data.index("some")] = "something else"

Wenn Sie jedoch nur darüber hinweglaufen möchten, verwenden Sie enumerate() wie von David vorgeschlagen.

5
Tim Pietzcker

die Indizierung einer Liste mit ganzen Zahlen kann ineffizient sein. Es ist wahrscheinlich, dass Python Listenelemente unter Verwendung verknüpfter Tabellen mit zugrunde liegenden Zeigern speichert. In diesem Fall muss Python die Liste bis zum i-ten Element durchlaufen, um ein bestimmtes Element zu finden.

Es wird empfohlen, ein solches Format zu verwenden, um effizient zu sein:.

0
Jingpeng Wu