Wie kann man einem Tupel einen Mehrwert verleihen?


79

Ich arbeite an einem Skript, in dem ich eine Liste mit Tupeln wie habe ('1','2','3','4'). z.B:

list = [('1','2','3','4'),
        ('2','3','4','5'),
        ('3','4','5','6'),
        ('4','5','6','7')]

Jetzt muss ich hinzufügen '1234', '2345', '3456'und '4567'jeweils am Ende jedes Tupel. z.B:

list = [('1','2','3','4','1234'),
        ('2','3','4','5','2345'),
        ('3','4','5','6','3456'),
        ('4','5','6','7','4567')]

Ist es irgendwie möglich?


8
sprachübergreifende Lösung? ;)
Snowbear

2
Willkommen bei StackOverflow! Rechts, als Sie Ihre Frage stellten, befand sich dieses praktische Feld zum Formatieren . Eine Lektüre wert, ebenso wie die Seite, die über [?] Direkt über dem Fragenbereich verlinkt ist.
TJ Crowder

3
Zumindest in Python sind Tupel unveränderlich. Wenn Sie einem Tupel "etwas hinzufügen" möchten, verwenden Sie von Anfang an eine veränderbare Datenstruktur.
Felix Kling

2
Ich mache es auch - meistens mit "Datei", weil "für Datei in Dateien" so verdammt natürlich ist! - aber im Allgemeinen sollten Sie wahrscheinlich vermeiden, Ihre Listen "Liste" zu nennen, die die eingebaute "Liste" ersetzt.
DSM

Antworten:


137

Tupel sind unveränderlich und dürfen nicht geändert werden - dafür ist der Listentyp gedacht. Sie können jedes Tupel durch ersetzen originalTuple + (newElement,)und so ein neues Tupel erstellen. Zum Beispiel:

t = (1,2,3)
t = t + (1,)
print t
(1,2,3,1)

Ich würde jedoch eher vorschlagen, von Anfang an Listen zu verwenden, da diese schneller zum Einfügen von Elementen geeignet sind.

Und noch ein Hinweis: Überschreiben Sie nicht den listin Ihrem Programm integrierten Namen, sondern rufen Sie die Variable loder einen anderen Namen auf. Wenn Sie den integrierten Namen überschreiben, können Sie ihn im aktuellen Bereich nicht mehr verwenden.


23
Eine Kurzschriftt += 1,

1
Hervorragende Punkte Ich bin jedoch in einer unglücklichen Situation, in der ich einer sqlite3Datenbank iterativ Werte hinzufügen möchte und ein Tupel der hinzuzufügenden Werte erstellen muss (da die erforderliche Syntax lautet VALUES (v1, v2, v3, ...). In diesem Fall muss ich wissen, wie man a Werte hinzufügt Tupel ist sehr vorteilhaft.
HS-Nebel

16

Aufgrund der Syntax schätze ich, dass dies Python ist. Der Sinn eines Tupels ist, dass es unveränderlich ist. Sie müssen also jedes Element durch ein neues Tupel ersetzen:

list = [l + (''.join(l),) for l in list]
# output:
[('1', '2', '3', '4', '1234'), 
 ('2', '3', '4', '5', '2345'), 
 ('3', '4', '5', '6', '3456'), 
 ('4', '5', '6', '7', '4567')]

5
Das funktioniert natürlich. Aber sollte das wirklich getan werden? Ich wundere mich. Weil dies den Zweck, überhaupt ein Tupel zu haben, zunichte macht. Oder liege ich falsch?
user225312

9

In Python können Sie nicht. Tupel sind unveränderlich.

In der enthaltenen Liste können Sie jedoch das Tupel ('1', '2', '3', '4')durch ein anderes ('1', '2', '3', '4', '1234')Tupel ersetzen .


8

Wie in anderen Antworten erwähnt, sind Tupel nach ihrer Erstellung unveränderlich, und eine Liste kann Ihren Zwecken besser dienen.

Eine weitere Option zum Erstellen eines neuen Tupels mit zusätzlichen Elementen ist die Verwendung des Splat-Operators:

new_tuple = (*old_tuple, 'new', 'items')

Ich mag diese Syntax, weil sie aussieht wie ein neues Tupel und daher klar kommuniziert, was Sie versuchen zu tun.

Mit splat ist eine mögliche Lösung:

list = [(*i, ''.join(i)) for i in list]


7

Wie andere Leute geantwortet haben, sind Tupel in Python unveränderlich und die einzige Möglichkeit, eines zu ändern, besteht darin, ein neues mit den angehängten Elementen zu erstellen.

Die beste Lösung ist jedoch eine Liste. Wenn eine Funktion oder Methode aufgerufen werden muss, für die ein Tupel erforderlich ist, erstellen Sie ein Tupel mithilfe von Tupel (Liste).


4

Ich habe einige Details im Zusammenhang mit tupleund durchgesehen list, und was ich verstanden habe, ist:

  • Tupel sind HeterogeneousErfassungsdatentypen
  • Tupel hat eine feste Länge (pro Tupeltyp)
  • Tupel sind immer endlich

Um ein neues Element an ein Tupel anzuhängen, müssen Sie es in ein Tupel umwandeln listund append()es bearbeiten. Anschließend müssen Sie es erneut in ein Tupel umwandeln.

Aber persönlich , was ich fühlte über die Frage ist, ob Tupeln sein sollen endlich , mit fester Länge Artikel und wenn wir diese Datentypen in unserer Anwendungslogik verwenden , dann sollte es nicht ein Szenario sein , neue Produkte zu Anhängen oder Aktualisieren eines Elements Wert in es. Anstelle der Liste der Tupel sollte es also eine Liste der Liste selbst sein. Habe ich Recht damit?


1
Es gibt Szenarien, in denen Sie ein Tupel an eine Funktion übergeben müssen, z. B. mit SQL (psycopg2) oder mit R (rpy2). Die Funktionen funktionieren nicht immer richtig, wenn eine Liste anstelle eines Tupels angegeben wird. Manchmal erhalten Sie auch ein Tupel von einer Funktion anstelle einer Liste. Tupel können verhindern, dass eine ursprüngliche Liste versehentlich geändert wird, wenn Sie stattdessen an einer Kopie einer Liste arbeiten sollten. Also ja, entweder direkt oder indirekt sind Listen Vermittler in den präsentierten Antworten. In vielen Szenarien ist es jedoch immer noch logisch, am Ende auf ein Tupel zurückzugreifen.
Nate Wanner

2
    list_of_tuples = [('1', '2', '3', '4'),
                      ('2', '3', '4', '5'),
                      ('3', '4', '5', '6'),
                      ('4', '5', '6', '7')]


    def mod_tuples(list_of_tuples):
        for i in range(0, len(list_of_tuples)):
            addition = ''
            for x in list_of_tuples[i]:
                addition = addition + x
            list_of_tuples[i] = list_of_tuples[i] + (addition,)
        return list_of_tuples

    # check: 
    print mod_tuples(list_of_tuples)

0
OUTPUTS = []
for number in range(len(list_of_tuples))):
    tup_ = list_of_tuples[number]
    list_ = list(tup_)  
    item_ = list_[0] + list_[1] + list_[2] + list_[3]
    list_.append(item_)
    OUTPUTS.append(tuple(list_))

AUSGÄNGE ist das, was Sie wünschen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.