2017-10-11 62 views
1

是否有内置方法将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,这可能不是我们想要的。

+2

有没有一种内置的方式......例如一个空元组发生什么事情,它是一个空元组还是一个后备值,比如'None'? (更不用说,如果你期待的元组有时可能不会是 - 嗯......) –

+0

另一方面,这个任务可能太短而且很简单,因为它有一个库函数。 – schwobaseggl

+2

这样做不需要你在使用这里的值来确定你是否有一个元组或值时使用特殊逻辑?你在用什么? – Sayse

回答

6

有一个内置的方式来提取单个项目出了一个元组。这样就访问了它的第一个索引,即tpl[0]

但是不,没有内置的方法来提取一个元组到其单个值,但保留所有其他元组。如果你仔细想想,这将是一种危险的操作:

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

虽然像len(x)会工作的优良元组xlen(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 
2

它可以作为低级任务传递,但它不是你偶尔做的事;没有理由为此奉献内建。没有直接的功能要做到这一点,您可以使用但三元有条件做到这一点

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

然而,如果这更具可读性,并且如果封装在一个函数中,它仍然只能重用,那么它是有争议的。 – schwobaseggl

+1

@schwobaseggl几乎没有任何代码行不具备争议性。除了它由GvR写的。 –

0

如果您知道的元组有一个元素,你可以只解开它

value, = x 

但是没有内置的方式,也检查

相关问题