在下面的例子中,我希望所有元素都是元组,为什么元组只包含一个字符串时会转换为字符串?
>>> a = [('a'), ('b'), ('c', 'd')]
>>> a
['a', 'b', ('c', 'd')]
>>>
>>> for elem in a:
... print type(elem)
...
<type 'str'>
<type 'str'>
<type 'tuple'>
答案 0 :(得分:88)
因为前两个元素不是元组;他们只是字符串。括号不会自动使它们成为元组。你必须在字符串后面添加一个逗号来向python表明它应该是一个元组。
>>> type( ('a') )
<type 'str'>
>>> type( ('a',) )
<type 'tuple'>
要修复示例代码,请在此处添加逗号:
>>> a = [('a',), ('b',), ('c', 'd')]
^ ^
来自Python Docs:
一个特殊的问题是构造包含0或1个项目的元组:语法有一些额外的怪癖来适应这些。空元组由一对空括号构成;通过使用逗号跟随值来构造具有一个项目的元组(仅在括号中包含单个值是不够的)。丑陋但有效。
如果您真的讨厌尾随逗号语法,则解决方法是将list
传递给tuple()
函数:
x = tuple(['a'])
答案 1 :(得分:17)
你的前两个例子不是元组,它们是字符串。单项元组需要一个尾随逗号,如:
>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
答案 2 :(得分:8)
('a')
不是元组,只是一个字符串。
您需要在最后添加一个额外的逗号,以使python
将其视为tuple
: -
>>> a = [('a',), ('b',), ('c', 'd')]
>>> a
[('a',), ('b',), ('c', 'd')]
>>>
答案 3 :(得分:0)
有两种创建带有单个元素的元组的方法。
(i)第一个是,创建一个用逗号分隔的单个元素,然后它将是一个元组。
>>>t2 = ('a',)
>>>print(type(t2))
<class tuple>
(ii)第二个方法是,使用s个单个元素创建一个列表,然后将其转换为元组。然后将是元组。
>>>l1 = [1]
>>>t1 = tuple(l1)
>>>print(type(t1))
<class tuple>
答案 4 :(得分:0)
在整个页面上都显示出来,令我惊讶的是,为什么没有人提到一种使用一个元素的元组的非常常见的方法。可能是版本问题,因为这是一个很老的帖子。无论如何,这里是:
from scipy.stats import norm as gauss
def W_gauss(p, u, v, num_steps):
ud = gauss(*gauss.fit(u))
vd = gauss(*gauss.fit(v))
z = np.linspace(0, 1, num_steps, endpoint=False) + 1/(2*num_steps)
return np.mean(np.abs(ud.ppf(z) - vd.ppf(z))**p)**(1/p)