2017-10-11 218 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 

但是沒有內置的方式,也檢查

相關問題