Converter lista em tupla em Python


544

Estou tentando converter uma lista em uma tupla.

A maioria das soluções no Google oferece o seguinte código:

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

No entanto, o código resulta em uma mensagem de erro quando eu o executo:

TypeError: o objeto 'tuple' não é passível de chamada Como posso corrigir esse problema?


78
Você atribuiu o nome da variável em tupleoutro lugar antes?
eumiro

18
Para não ser muito exigente, você provavelmente também não deve usar "el" minúsculo como um nome de variável devido à sua semelhança com 1. O mesmo vale para maiúscula "oh" devido à semelhança com zero. Até "li" é muito mais legível em comparação.
Albert Rothman

Respostas:


815

Deve funcionar bem. Não use tuple, listou outros nomes especiais como um nome de variável. Provavelmente é o que está causando seu problema.

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

109

Expandindo o comentário de eumiro, normalmente tuple(l)converte uma lista lem uma tupla:

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

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

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

No entanto, se você redefiniu tuplepara ser uma tupla em vez de type tuple:

In [4]: tuple = tuple(l)

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

então você obtém um TypeError, pois a tupla em si não pode ser chamada:

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

Você pode recuperar a definição original tuplefechando e reiniciando seu intérprete ou (graças a @glglgl):

In [6]: del tuple

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

29

Você pode ter feito algo assim:

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

Aqui está o problema ... Como você usou uma tuplevariável para armazenar uma tuple (45, 34)anterior ... Então, agora tupleé objectdo tipo tupleagora ...

Não é mais um typee, portanto, não é mais Callable.

Neveruse qualquer tipo interno como o nome da variável ... Você tem outro nome para usar. Use qualquer nome arbitrário para sua variável ...


25

Para adicionar outra alternativa para tuple(l), a partir do Python> =, 3.5você pode fazer:

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

curto, um pouco mais rápido, mas provavelmente sofre de legibilidade.

Isso basicamente descompacta a lista lem um literal de tupla, criado devido à presença de uma vírgula única ,.


Ps: O erro que você está recebendo é devido ao mascaramento do nome, tupleou seja, você atribuiu à tupla de nome em algum lugar, por exemplo tuple = (1, 2, 3).

Usando del tuplevocê deve estar pronto para ir.


4

Encontro muitas respostas atualizadas e respondidas corretamente, mas adicionarei algo novo à pilha de respostas.

Em python, existem infinitas maneiras de fazer isso, eis algumas instâncias de
maneira normal

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

forma inteligente

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

Lembre-se de que a tupla é imutável, usada para armazenar algo valioso. Por exemplo, senha, chave ou hashes são armazenados em tuplas ou dicionários. Se for necessária uma faca, use a espada para cortar maçãs. Use-o com sabedoria, também tornará seu programa eficiente.


2
Qual é a vantagem da segunda via?
Granny Aching

@GrannyAching nesta definição de mundo moderno de inteligente continua mudando, uma vez que é uma abordagem preguiçosa feita em uma linha, acho que é uma maneira inteligente.
TheExorcist

1
tuple(l)(primeira via) é mais curto que tuple(item for item in l)(segunda via).
Granny Aching
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.