Liste in Python in Tupel konvertieren

544

Ich versuche, eine Liste in ein Tupel umzuwandeln.

Die meisten Lösungen bei Google bieten den folgenden Code:

l = [4,5,6]
tuple(l)

Der Code führt jedoch zu einer Fehlermeldung, wenn ich ihn ausführe:

TypeError: 'Tupel'-Objekt kann nicht aufgerufen werden Wie kann ich dieses Problem beheben?

LynnH
quelle
78
Haben Sie den Variablennamen schon einmal an einer tupleanderen Stelle vergeben?
Eumiro
18
Um nicht zu wählerisch zu sein, sollten Sie wegen der Ähnlichkeit mit 1 wahrscheinlich auch kein Kleinbuchstaben "el" als Variablennamen verwenden. Gleiches gilt für das Großbuchstaben "oh" aufgrund seiner Ähnlichkeit mit Null. Sogar "li" ist im Vergleich viel besser lesbar.
Albert Rothman

Antworten:

815

Es sollte gut funktionieren. Nicht verwenden tuple, listoder andere spezielle Namen als Variablennamen. Es ist wahrscheinlich das, was Ihr Problem verursacht.

>>> l = [4,5,6]
>>> tuple(l)
(4, 5, 6)
Wurzel
quelle
109

Wenn Sie den Kommentar von eumiro erweitern, wird normalerweise tuple(l)eine Liste lin ein Tupel konvertiert :

In [1]: l = [4,5,6]

In [2]: tuple
Out[2]: <type 'tuple'>

In [3]: tuple(l)
Out[3]: (4, 5, 6)

Wenn Sie jedoch neu definiert haben tuple, ein Tupel zu sein, anstatt type tuple:

In [4]: tuple = tuple(l)

In [5]: tuple
Out[5]: (4, 5, 6)

dann erhalten Sie einen TypeError, da das Tupel selbst nicht aufrufbar ist:

In [6]: tuple(l)
TypeError: 'tuple' object is not callable

Sie können die ursprüngliche Definition wiederherstellen, tupleindem Sie Ihren Interpreter beenden und neu starten, oder (dank @glglgl):

In [6]: del tuple

In [7]: tuple
Out[7]: <type 'tuple'>
unutbu
quelle
29

Sie könnten so etwas getan haben:

>>> tuple = 45, 34  # You used `tuple` as a variable here
>>> tuple
(45, 34)
>>> l = [4, 5, 6]
>>> tuple(l)   # Will try to invoke the variable `tuple` rather than tuple type.

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    tuple(l)
TypeError: 'tuple' object is not callable
>>>
>>> del tuple  # You can delete the object tuple created earlier to make it work
>>> tuple(l)
(4, 5, 6)

Hier ist das Problem ... Da Sie eine tupleVariable verwendet haben, um eine tuple (45, 34)frühere zu halten ... Also, jetzt tupleist eine objectvom Typ tuplejetzt ...

Es ist nicht mehr ein typeund daher ist es nicht mehr Callable.

NeverVerwenden Sie einen beliebigen integrierten Typ als Variablennamen ... Sie müssen einen anderen Namen verwenden. Verwenden Sie stattdessen einen beliebigen Namen für Ihre Variable ...

Rohit Jain
quelle
25

Um eine weitere Alternative zu tuple(l)Python> = hinzuzufügen , 3.5können Sie Folgendes tun:

t = *l,  # or t = (*l,) 

kurz, etwas schneller, leidet aber wahrscheinlich an Lesbarkeit.

Dadurch wird die Liste lim Wesentlichen in einem Tupelliteral entpackt, das aufgrund des Vorhandenseins eines einzelnen Kommas erstellt wird ,.


Ps: Der Fehler, den Sie erhalten, ist auf die Maskierung des Namens zurückzuführen, tupledh Sie haben das Namenstupel irgendwo zugewiesen, z tuple = (1, 2, 3).

Mit del tuplesollten Sie gut zu gehen.

Dimitris Fasarakis Hilliard
quelle
4

Ich finde viele Antworten aktuell und richtig beantwortet, werde aber dem Stapel der Antworten etwas Neues hinzufügen.

In Python gibt es unendlich viele Möglichkeiten, dies zu tun, hier sind einige Beispiele
Normaler Weg

>>> l= [1,2,"stackoverflow","python"]
>>> l
[1, 2, 'stackoverflow', 'python']
>>> tup = tuple(l)
>>> type(tup)
<type 'tuple'>
>>> tup
(1, 2, 'stackoverflow', 'python')

kluger Weg

>>>tuple(item for item in l)
(1, 2, 'stackoverflow', 'python')

Denken Sie daran, dass Tupel unveränderlich ist und zum Speichern von Wertgegenständen verwendet wird. Zum Beispiel werden Passwort, Schlüssel oder Hashes in Tupeln oder Wörterbüchern gespeichert. Wenn ein Messer benötigt wird, warum sollte man ein Schwert verwenden, um Äpfel zu schneiden? Verwenden Sie es mit Bedacht, es wird auch Ihr Programm effizienter machen.

Der Exorzist
quelle
2
Was ist der Vorteil des zweiten Weges?
Oma schmerzt
@GrannyAching in dieser modernen Welt ändert sich die Definition von Smart ständig, da es sich um einen faulen Ansatz handelt, der in einer Zeile ausgeführt wird. Ich denke, es ist ein intelligenter Weg.
TheExorcist
1
tuple(l)(erster Weg) ist kürzer als tuple(item for item in l)(zweiter Weg).
Oma schmerzt