【问题标题】:Why is a tuple of tuples of length 1 not actually a tuple unless I add a comma?除非我添加逗号,否则为什么长度为 1 的元组实际上不是元组?
【发布时间】:2015-09-26 10:25:04
【问题描述】:

给定一个元组T

(('a', 'b'))

和一个单独的元组t1

('a','b')

为什么会这样:

t1 in T

返回假?

更新:来自 Ipython:

In [22]: T = (('a','b'))

In [23]: t1 = ('a','b')

In [24]: t1 in T
Out[24]: False

然后如何检查一个元组是否在另一个元组中?

【问题讨论】:

  • 你确定它返回False,我猜它应该返回True
  • 你能发布更多你的代码吗?你具体是从哪里得到这个结果的?是否有一个 if 正在评估您不期望的 wya?
  • @IanAuld 上面添加的代码

标签: python python-2.7 indexing tuples elements


【解决方案1】:

问题是因为 T 不是元组的元组,它只是一个元组。逗号构成一个元组,而不是括号。应该是:

>>> T = (('a','b'),)
>>> t1 = ('a', 'b')
>>> t1 in T
True

其实你可以去掉外括号:

>>> T = ('a','b'),
>>> t1 = 'a','b'
>>> type(T)
<type 'tuple'>
>>> type(T[0])
<type 'tuple'>
>>> type(t1)
<type 'tuple'>
>>> t1 in T
True

虽然有时它们是优先级所必需的,但如果有疑问,请将它们放入。但请记住,是逗号使它成为一个元组。

【讨论】:

  • 我在很多地方都看到了这种误解——构成元组的不是括号,而是逗号。不过,这可能是一个尴尬的发现!
  • 逗号组成一个元组? type(t1) 不应该返回元组。因此,如果有一堆代码最终创建了一个无法预先知道长度的元组的元组,如果我想检查是否存在单个元组,我首先必须检查长度,如果它是 1,我必须加逗号??告诉我这不是……
  • @Pyderman (1,2,3,) 等价于(1,2,3),所以我总是加逗号
  • @Pyderman。不是这样的。甚至不清楚你的意思。关键是一个元素元组的 *literal" 形式需要一个逗号。如果您以编程方式构建一个元组,那么无论如何您都不会输入逗号。同样type(t1) 返回元组,因为它是一个元组。但不是元组的元组,这就是你想要的。
  • @Pyderman - 是的,明白你的意思。否 - 仅当元组长度为 1 时才需要尾随逗号。关键是文字元组至少需要一个逗号。没有逗号的括号有不同的含义,如2 * (3 + 4)
【解决方案2】:

这样做(('a', 'b')) 不会生成包含元组的元组,如您在此处看到的:

>>> T = (('a','b'))
>>> T
('a', 'b')

要制作单个元素的元组,您需要添加一个逗号:

>>> T = (('a','b'),)
>>> t1 in T
True
>>> T
(('a', 'b'),)

事实上,括号甚至不是必需的,因为这也会创建一个元组:

>>> t1 = 'a','b'
>>> t1
('a', 'b')
>>> 1,2,3,4,5,6
(1, 2, 3, 4, 5, 6)

【讨论】:

  • 根据我在 cdarke 的回答中的评论:因此,如果有一堆代码最终创建了一个无法提前知道长度的元组的元组,那么如果我想检查是否存在单元组,我首先要检查长度,如果是1,我要加逗号??
  • 你能举个例子吗?
  • @Pyderman 在这种情况下(事先不知道长度),首先列表似乎更适合我......
【解决方案3】:

再次检查。您的代码中的其他地方可能存在错误。此检查确实有效。

至于更新,您不是在创建嵌套元组。

(('a', 'b')) == ('a', 'b')

如果你需要一个单元素元组,你需要一个尾随逗号:

(('a', 'b'),)

【讨论】:

  • 这应该是评论而不是答案。
  • @IanAuld:不,这是一个答案。我们还能说什么?
  • @IanAuld,ikaros45 Chillax 人。更新问题,更新答案。你有几分钟的时间来实际回答这个问题,但决定改为放弃这个。让我们来帮助 OP。
  • @viraptor 谢谢。因此,除非我在单个元组之后添加逗号,否则我的元组的单项“元组”似乎并不是真正的元组。看起来很愚蠢。
  • @Pyderman 它将分组与元组分开。在像(1 + 2) + 3 这样的情况下,您不希望从第一个总和中获得一个元组,对吧?同样适用于元组 -> (('a', 'b') + ('c', 'd')) 只是对总和进行分组,而不是从结果中生成一个元组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多