如何创建一个仅包含一个元素的“单例”元组?

174
在下面的例子中,我期望所有的元素都是元组,为什么只包含一个字符串的元组会被转换为字符串?
>>> a = [('a'), ('b'), ('c', 'd')]
>>> a
['a', 'b', ('c', 'd')]
>>> 
>>> for elem in a:
...     print type(elem)
... 
<type 'str'>
<type 'str'>
<type 'tuple'>

2
('a') 只会得到 'a' 的评估结果。 - obataku
3
哇——3分钟内回答了3个正确的答案:) 但是请注意,逗号“,”的秘密:a = 1, 2, 3; print a - user166390
39
括号并不能构成元组,逗号才是关键。 - cdarke
19
除了空元组 (),它只包含一对括号外,其他都翻译过来了。 - Frédéric Hamidi
2
对于一个空元组,真实际上是 False,不过基本上它只有这个作用。 - cdarke
显示剩余3条评论
5个回答

223
为什么一个只包含一个字符串的元组会被转换成字符串?
a = [('a'), ('b'), ('c', 'd')]
因为前两个元素不是元组,它们只是字符串。圆括号并不能自动将它们变成元组。你需要在字符串后面添加一个逗号来告诉Python应该将它视为元组。
>>> type( ('a') )
<type 'str'>

>>> type( ('a',) )
<type 'tuple'>

为了修复您的示例代码,请在这里添加逗号:

>>> a = [('a',), ('b',), ('c', 'd')]

             ^       ^

Python Docs中得知:

构建包含0或1个元素的元组是一个特殊问题:语法上有一些额外的怪癖来适应这些情况。空元组可以通过一对空括号构造;一个元素的元组是通过在值后面加上逗号构造的(将单个值括在括号中是不够的)。这很丑陋,但也有效。

如果您真的不喜欢带逗号的语法,则可以使用一个解决方法,即将列表传递给tuple()函数:

x = tuple(['a'])

11
有没有其他方法?这种方式不是很优雅,看起来有点混乱。 - Robert Moore
3
似乎那不起作用。例如:tuple("abc")(带或不带额外逗号)得到的结果是('a', 'b', 'c'),而("abc",)得到的结果是('abc')。因此,tuple()在这里似乎不是可行的选项。 - Ben Farmer
4
看看这个文档tuple接受一个可迭代对象,而字符串就是可迭代的(按字符迭代)。如果你坚持不使用尾随逗号,那么可以先创建一个中间列表:tuple(['abc']) - Jonathon Reinhart
当然,我只是在说tuple函数并不能取代逗号的使用。 - Ben Farmer
有没有更明确的Python 3.x变体呢? - matanster
1
@matanster 语言语法在这方面没有改变。据我所知,Python 2和3的问题是相同的。 - Jonathon Reinhart

26

你的前两个例子不是元组,它们是字符串。单项元组需要一个尾逗号,例如:

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]

15

('a')不是元组,而是字符串。

你需要在末尾添加一个额外的逗号,以使python将它们视为tuple:-

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
>>> 

-1

=> 如果你需要将一个包含一个id元素的列表转换为元组,那么这个解决方案会对你有所帮助。

x_list = [1]

x_tuple = tuple(x_list)

=> 你将会得到这个

(1,)

=> 现在将0添加到列表中,然后将其转换为元组

=> x_list.append(0)

=> x_tuple = tuple(x_list)

(1, 0)

这与所问的问题有什么关系? - Chris

-2

我看到了这个页面,很惊讶为什么没有人提到一个非常常见的只有一个元素的元组方法。也许这是版本问题,因为这是一个非常古老的帖子。无论如何,这就是它:

>>> b = tuple(('a'))
>>> type(b)
<class 'tuple'>

奇怪的是,当其他答案不起作用时,这对我有用(将字符串值传递给方法,因此我使用变量而不是原始字符串;也许这就是为什么 (foo,) 对我不起作用的原因)。 - Jonathan E. Landrum
1
如果输入字符串有多个字符,那么这个程序将无法按预期工作。例如,尝试运行 tuple(('ab')),结果将是 ('a', 'b') 而不是 ('ab',) - Georgy
在这种情况下,通常更好的方法是提供一个列表,以避免尾随逗号语法。例如:tuple(['ab']) - Aaj Kaal
2
这种方法仅适用于长度为1的字符串,其他情况不适用。正确的语法是 tuple([var]) - Peter Ye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接