3 Stimmen

Sind Python-Tupel änderbar?

Ich lese einige Daten ein und analysiere sie. Im Grunde ist die Daten ein Bündel von Integers und Strings, so kann ich nicht nur eine Liste verwenden, um die Daten zu speichern. Es gibt eine bestimmte Anzahl von Elementen, die in jedem Datensatz enthalten sind, aber manchmal fehlen einige. Hier ist, was ich habe.

users = [] # list of objects I'll be creating

# this all gets looped.  snipped for brevity
data = "id", "gender", -1 # my main tuple that I will create my object with
words = line.split()
index = 0
data[0] = words[index]
index += 1
if words[index] == "m" or words[index] == "f":
    data[1] = words[index]
    index += 1
else:
    data[1] = "missing"

if words[index].isdigit():
    data[2] = words[index]
    index += 1

users.append(User(data))

Das Problem ist, dass man nicht in der Lage zu sein scheint, Tupeln direkt zuzuweisen (z. B. data[1] = "missing" ), wie sollte diese also pythonisch zugeordnet werden?

4voto

Adam Crossland Punkte 14129

Das ist richtig, Tupel sind unveränderlich. Sie können jedoch beliebige andere Typen in eine Python-Liste einfügen.

>>> a = []
>>> a.append("a")
>>> a.append(1)
>>> a.append(False)
>>> print a
['a', 1, False]

4voto

David Heffernan Punkte 585606

Python-Tupel sind unveränderlich. Vom Dokumentation :

Tupel sind wie Zeichenketten unveränderlich: Es ist nicht möglich, den einzelnen Elementen eines Tupels Zuweisungen zuzuweisen (Sie können jedoch mit Slicing und Verkettung weitgehend denselben Effekt simulieren). Es ist auch möglich, Tupel zu erstellen, die veränderbare Objekte enthalten, wie z. B. Listen.

Das ist das Wichtigste, was sie von den Listen unterscheidet. Das führt uns zu einer möglichen Lösung: Verwenden Sie eine Liste anstelle eines Tupels:

data = ["id", "gender", -1]

0voto

Silas Ray Punkte 25276

Wenn Sie ein Tupel verwenden müssen (obwohl, wie andere gesagt haben, eine Liste sollte gut funktionieren), speichern Sie einfach Ihre Daten zu temporären Variablen und erstellen Sie das Tupel von Grund auf mit den temps am Ende der Schleife anstelle von am Anfang mit Dummy-Werte.

0voto

Speediro Punkte 543

Aus Ihrem Code geht hervor, dass das erste Feld "id" niemals fehlen wird. Nehmen wir an, Sie wollen wirklich ein Tupel für die Übergabe an Ihre User-Klasse.

Sie könnten zuerst Ihre Prüfungen durchführen und dann die Gesamtheit des Ergebnisses Ihrem Tupel zuweisen...

if words[1] in "mf":
    data=tuple(words[i] for i in range(0,3))
else:
    data=words[0],"missing",words[2]

Sie sollten jedoch darauf achten, dass die nachfolgenden Felder (sofern vorhanden) korrekt aufgeteilt werden, da sonst die Bedeutung der Felder durcheinandergeraten kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X