Konwertuj listę na krotkę w Pythonie

544

Próbuję przekonwertować listę na krotkę.

Większość rozwiązań w Google oferuje następujący kod:

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

Jednak kod powoduje komunikat o błędzie po uruchomieniu:

TypeError: Obiekt „tuple” nie jest wywoływalny Jak mogę rozwiązać ten problem?

LynnH
źródło
78
Czy wcześniej przypisałeś nazwę zmiennej w tupleinnym miejscu?
eumiro
18
Nie być zbyt wybrednym, ale prawdopodobnie nie powinieneś również używać małej litery „el” jako nazwy zmiennej ze względu na jej podobieństwo do 1. To samo odnosi się do dużej litery „o” ze względu na podobieństwo do zera. Nawet „li” jest znacznie bardziej czytelne w porównaniu.
Albert Rothman,

Odpowiedzi:

815

Powinno działać dobrze. Nie używać tuple, listlub inne specjalne nazwy jako nazwy zmiennej. Prawdopodobnie jest to przyczyną twojego problemu.

>>> l = [4,5,6]
>>> tuple(l)
(4, 5, 6)
korzeń
źródło
109

Rozszerzając komentarz eumiro, zwykle tuple(l)konwertuje listę lna krotkę:

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

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

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

Jeśli jednak na nowo zdefiniowałeś tuplekrotkę, a nie type tuple:

In [4]: tuple = tuple(l)

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

wtedy pojawia się błąd typu, ponieważ sama krotka nie jest wywoływalna:

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

Możesz odzyskać oryginalną definicję tuple, zamykając i ponownie uruchamiając interpretera lub (dzięki @glglgl):

In [6]: del tuple

In [7]: tuple
Out[7]: <type 'tuple'>
unutbu
źródło
29

Być może zrobiłeś coś takiego:

>>> 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)

Oto problem ... Ponieważ użyłeś tuplezmiennej do przechowywania tuple (45, 34)wcześniej ... Więc teraz tuplejest coś objectw rodzaju tuple...

To już nie jest typei dlatego już nie ma Callable.

Neverużyj dowolnego wbudowanego typu jako nazwy zmiennej ... Masz inną nazwę do użycia. Zamiast tego użyj dowolnej nazwy dla swojej zmiennej ...

Rohit Jain
źródło
25

Aby dodać kolejną alternatywę dla tuple(l)Python> = 3.5możesz:

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

Krótko, nieco szybciej, ale prawdopodobnie cierpi z powodu czytelności.

To zasadniczo rozpakowuje listę lwewnątrz krotkowego literału, który jest tworzony z powodu obecności pojedynczego przecinka ,.


Ps: Otrzymany błąd wynika z maskowania nazwy, tupletzn. Przypisałeś gdzieś nazwę krotki np tuple = (1, 2, 3).

Korzystanie z del tupleciebie powinno być dobre.

Dimitris Fasarakis Hilliard
źródło
4

Znajduję wiele odpowiedzi na bieżąco i poprawnie udzielonych, ale dodam coś nowego do stosu odpowiedzi.

W Pythonie istnieją nieskończone sposoby, aby to zrobić, oto kilka przykładów
Normalny sposób

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

rozsądne rozwiązanie

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

Pamiętaj, że krotka jest niezmienna, służy do przechowywania czegoś cennego. Na przykład hasło, klucz lub skróty są przechowywane w krotkach lub słownikach. Jeśli potrzebny jest nóż, po co używać miecza do krojenia jabłek. Używaj go mądrze, sprawi to, że Twój program będzie wydajny.

Egzorcysta
źródło
2
Jaka jest zaleta drugiego sposobu?
Babcia Boli
@GrannyAching w tym nowoczesnym świecie definicja smart ciągle się zmienia, ponieważ jest to leniwe podejście wykonane w jednej linii, myślę, że jest to inteligentny sposób.
Egzorcysta,
1
tuple(l)(pierwszy sposób) jest krótszy niż tuple(item for item in l)(drugi sposób).
Babcia Boli