2011-03-15 65 views
0

我能理解zip()功能是用於構建元組的列表如下:Returing元組的鍵列表和值

x = ['a', 'b', 'c'] 
y = ['x', 'y', 'z', 'l'] 
lstTupA = zip(x,y) 

lstTupA[('a', 'x'), ('b', 'y'), ('c', 'z')]

lstA, lstB = zip(*lstTupA) 

上述操作中的元組的元組中的至lstB列表中的列表,以lstAvalues提取keys

lstA('a', 'b', 'c')lstB('x', 'y', 'z')

我的查詢是這樣的:爲什麼lstAlstB元組而不是列表? a,bc是同質的,因此是x,yz。將它們分組爲元組是不合邏輯的,是嗎?

理想lstA, lstB = zip(*lstTupA)應該分配給['a', 'b', 'c']lstA['x', 'y', 'z']lstB(名單)吧?

有人請澄清!

謝謝。

+2

「爲什麼元組返回函數返回元組? - 有點奇怪的問題。我認爲你可能是需要澄清的人。 – MattH 2011-03-15 12:54:47

+1

'zip'總是返回一個元組列表,沒有什麼意外的。做'lstA,lstB = zip(..)'只是吃外面的列表,它被稱爲序列解包。 – 2011-03-15 13:49:48

+0

@MattH - 是的,這是最終必須回答的問題! – bdhar 2011-03-15 13:52:15

回答

5

是的。這是合乎邏輯的。

有兩種內置序列。列表和元組。

zip()函數具有Ñ參數,它定義該元組的基數爲固定在Ñ

只有當其他參數以某種方式,神奇地,附加或不附加到結果序列時,列表才適用。這將意味着可變長度的序列,而不是由zip()的參數數量定義。這將是一個相當複雜的結構,只需要調用一個函數即可。

+0

不是集合和字符串也是內置序列嗎? – 2011-03-15 12:48:00

+1

@ Space_C0wb0y:集具有迭代器接口,但不是序列。他們沒有被職位索引。字符串,雖然序列,似乎是不合適的,它可能不值得一提。 – 2011-03-15 12:54:58

2

zip被簡單地定義到這樣的行爲:「這是不符合邏輯將它們分組元組,是」

In [2]: help(zip) 
Help on built-in function zip in module __builtin__: 

zip(...) 
    zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)] 

    --> Return a list of tuples <--, where each tuple contains the i-th element 
    from each of the argument sequences. The returned list is truncated 
    in length to the length of the shortest argument sequence. 
2

*lstTupA能做什麼在lstA, lstB = zip(*lstTupA)(或通常的*操作者)i到平坦化可迭代。這樣做zip(*lstTupA)等於zip(lstTupA[0], lstTupA[1], ...),這些項目是傳遞給zip的元組,這就是爲什麼lstAlstB是元組的原因。

1

zip不知道等號的左側是什麼。據瞭解,lstTupA = zip(x,y)lstA, lstB = zip(*lstTupA)是一回事。 zip被定義爲做一件事,並且在做這件事情時是不變的。你已經決定在第二個語句中分解元組列表,所以你是爲第二個語句添加額外上下文的人。

1

理想LSTA,LSTB =拉鍊(* lstTupA)應該分配[ 'A', 'B', 'C']至LSTA和[ 'X', 'Y', 'Z']至LSTB (列表)正確嗎?

不,那是不對的。請記住,該zip返回一個元組列表,這正是你期望它行爲的方式,當你說

lstTupA會[('a','x'),('b','y' ),('c','z')]。

那麼,它爲什麼會返回一些在zip(*lstTupA)的情況有什麼不同?它仍然會返回元組列表,在這種情況下爲[('a', 'b', 'c'), ('x', 'y', 'z')]。通過執行分配到lstAlstB,您只需從列表中提取元組。

0

是你必須做一些愚蠢像

[list(t) for t in zip(*lst)] 

只是爲了得到列表。

什麼'pythonistas'急於捍衛元組列表的braindead選擇不記得是元組不能被分配。這使得zip(*m)對於矩陣或任何其他想要稍後改變項目的東西都沒有用處