在Python中将列表转换为元组


544

我正在尝试将列表转换为元组。

Google上的大多数解决方案都提供以下代码:

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

但是,运行该代码会导致错误消息:

TypeError:“元组”对象不可调用如何解决此问题?


78
tuple之前是否在其他地方分配了变量名称?
eumiro

18
不要过于挑剔,但是由于变量名称与1相似,因此您也可能不应该使用小写字母“ el”作为变量名。由于其相似度为零,因此大写字母“ oh”也是如此。相比之下,甚至“ li”也更具可读性。
阿尔伯特·罗斯曼

Answers:


815

它应该工作正常。不要使用tuplelist或其他特殊的名字作为变量名。这可能是导致您出现问题的原因。

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

109

扩展eumiro的注释,通常tuple(l)会将列表l转换为元组:

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

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

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

但是,如果您已重新定义tuple为元组而不是type tuple

In [4]: tuple = tuple(l)

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

那么您会收到TypeError,因为元组本身不可调用:

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

您可以tuple通过退出并重新启动解释器来恢复原始定义,或者(感谢@glglgl):

In [6]: del tuple

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

29

您可能已经做过这样的事情:

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

这是问题所在...由于您使用了tuple变量来保存tuple (45, 34)较早的内容...所以,现在tupleobject类型tuple ...

它不再是一个type,因此不再Callable

Never使用任何内置类型作为变量名...您确实可以使用任何其他名称。请为变量使用任意名称...


25

tuple(l)自Python> =起,要向中添加其他替代方法,3.5您可以执行以下操作:

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

简短一点快,但可能是从可读性受到影响。

这实际上将列表解压缩到l元组文字中,该元组文字是由于单个逗号的存在而创建的,


Ps:您收到的错误是由于名称的掩盖所致,tuple即您在某处(例如)分配了名称元组tuple = (1, 2, 3)

使用del tuple您应该很好。


4

我找到了许多最新的答案,并且得到了正确答案,但会为答案添加一些新内容。

在蟒蛇有无限的方法可以做到这一点,这里有一些情况下,
正常的方式

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

聪明的方法

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

请记住,元组是不变的,用于存储有价值的东西。例如,密码,密钥或哈希存储在元组或字典中。如果需要刀,为什么要用剑切苹果。明智地使用它,还可以使您的程序高效。


2
第二种方式的优势是什么?
Granny Aching

在这个现代世界中,@ GrannyAching对智能的定义一直在变化,因为它是一行完成的惰性方法,所以我认为这是明智的方法。
TheExorcist '19

1
tuple(l)(第一种方法)比tuple(item for item in l)(第二种方法)短。
奶奶Aching
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.