如何创建仅包含一个元素的元组


107

在下面的示例中,我希望所有元素都是元组,为什么当元组仅包含单个字符串时,它会转换为字符串?

>>> a = [('a'), ('b'), ('c', 'd')]
>>> a
['a', 'b', ('c', 'd')]
>>> 
>>> for elem in a:
...     print type(elem)
... 
<type 'str'>
<type 'str'>
<type 'tuple'>

1
('a')的评估结果为'a'
oldrinb 2012年

1
哇-3分钟内提供3个正确答案:)但是,请注意以下秘密,a = 1, 2, 3; print a

26
括号不是元组,逗号是。
cdarke

17
@cdarke,除了空元组()(仅包含一对括号)。
弗雷德里克·哈米迪

2
没错,或者说False-几乎所有的空元组都有好处(如果您明白我的意思)。
cdarke

Answers:


140

因为前两个元素不是元组;他们只是字符串。括号不会自动使它们成为元组。您必须在字符串后添加一个逗号,以指示python它应该是一个元组。

>>> type( ('a') )
<type 'str'>

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

要修复示例代码,请在此处添加逗号:

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

             ^       ^

Python文档

一个特殊的问题是包含0或1项的元组的构造:语法有一些额外的怪癖来容纳这些项。空元组由一对空括号组成;一个带有一个项目的元组是通过在值后面加上逗号来构造的(仅将一个值括在括号中是不够的)。难看,但是有效。

如果您确实讨厌尾随的逗号语法,则一种解决方法是将a传递list给该tuple()函数:

x = tuple(['a'])

6
虽然这不是很优雅,但看起来有些混乱。还有其他办法吗?
罗伯特·摩尔

3
这似乎不起作用。例如:tuple(“ abc”)(带或不带逗号)给出('a','b','c'),而(“ abc”,)给出('abc')。因此,tuple()在这里似乎不是一个可行的选择。
本·法默

3
@Ben看一下 docstuple 接受一个iterable,它是一个字符串(在字符上迭代)。如果您坚持不使用结尾逗号,请列出一个中间列表:tuple(['abc'])
乔纳森·莱因哈特

当然,我只是说元组函数并不需要否定逗号。
本·法默

1
@matanster在这方面,语言语法没有更改。AFAIK问题就是Python 2和3相同的
乔纳森·莱因哈特


11

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

您需要在末尾添加一个逗号,以使其pythontuple:-

>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
>>> 
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.