将一个项目(单例)的元组减少到其值

时间:2017-10-11 11:01:35

标签: python

是否有内置方法将singleton tuple减少到(仅)值?

我可以使用如下函数来实现这一目标:

def foo(tup):
    if len(tup) == 1:
        return tup[0]
    return tup

这会将单例减少到其值,并保留非单例元组:

>>> x = (3, )
>>> foo(x)
3
>>> x = (3, 4)
>>> foo(x)
(3, 4)

但这似乎是一个相当低级别的任务,我敢打赌它已经潜伏在Python标准库的某个地方了。功能类型让我想起了numpy.squeeze,但这给我们留下了array,这可能不是我们想要的。

3 个答案:

答案 0 :(得分:7)

有一种内置方法可以从一元组中提取单个项目。这种方式是访问其第一个索引,即tpl[0]

但不是,没有内置的方法可以将单元组提取到单个值中,但保留所有其他元组。如果你考虑一下,这将是一种危险的操作:

你需要检查它的长度意味着你可能不知道它是一个元组还是一个不同大小的元组。这意味着你也无法分辨你的函数的返回值是什么:它可以是一个元组(任何大小不是1),或者它可能是其他东西(即一元组的值)。这使得你的函数非常脆弱,因为它不再具有明确的返回类型。

虽然len(x)之类的内容适用于元组x,但len(foo(x))可能不会x是一元组且内部元素不是序列。或者list(x)会将元组转换为列表;但list(foo(x))会将其转换为列表,或将内部的任何内容转换为列表。

因此,如果你考虑一下,你的功能并没有多大意义。这可能是为什么没有“解包单值(如果有的话)”的原因。

话虽这么说,你可以解包任何长度(大于0)的元组的第一个值。也许这就是你真正想做的事情:

>>> x = 1,
>>> y = 2, 3
>>> z = 4, 5, 6
>>> a, *_ = x
>>> a
1
>>> b, *_ = y
>>> b
2
>>> c, *_ = z
>>> c
4

答案 1 :(得分:2)

它可以作为一个低级任务通过,但它不是你不时做的事情;没有理由为此投入内置。没有直接的功能,你可以使用三元条件 flat

x = tup[0] if len(tup) == 1 else tup

答案 2 :(得分:0)

如果你知道元组有一个元素,你就可以打开它

value, = x

但是没有内置方式也可以检查