看板 Python 關於我們 聯絡資訊
※ 引述《uranusjr (←這人是超級笨蛋)》之銘言: : ※ 引述《WaiTingKuo (:!)》之銘言: : : In [12]: a = [1, 2, 3, 4, 5, 6] : : In [13]: for x, y, in zip(*[iter(a)]*2): : : ....: print x, y : : ....: : : 1 2 : : 3 4 : : 5 6 : 推 EntHeEnd:請問*[iter(a)]是什麼意思...@@? 07/12 00:55 : 你的運算優先權錯了 =p : a 是 list (i.e. a 是 iterable) : iter(a) 會得到 a 的 iterator : [iter(a)] 就包成一個單一元素的 list : [iter(a)] * 2 會得到一個有兩個元素的 list(而且兩個元素會相同) : *[iter(a)] * 2 會把這個 list 展開成 zip 的兩個參數 : 事實上 zip(*[iter(a)]*2) 就等同於 : a_iter = iter(a) : zip(a_iter, a_iter) : 事實上由於 iter 是回傳 reference, zip(iter(a), iter(a)) 也完全對等 是指 [iter(a)] * 2 跟 iter(a), iter(a) 比較嗎? 如果是的話,這不對等喔。 e.g. In [3]: a = range(4) In [4]: a Out[4]: [0, 1, 2, 3] In [5]: for k,v in zip( * [ iter(a)]*2 ) : print k,v 0 1 2 3 In [7]: for k,v in zip( iter(a), iter(a) ) : print k,v 0 0 1 1 2 2 3 3 ps: 我也不喜歡 list 的 乘法 ~ : 如果是我的話應該會這樣寫, 我個人很討厭 list 乘法... : 用 iter 的好處是不用複製一個 list, 也不會需要大量 random access : 所以效率會比較好 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.248.166.79 ※ 編輯: timTan 來自: 111.248.166.79 (07/12 02:40)
uranusjr:Hmm, 看來是我搞錯了 07/12 02:48
SansWord:關鍵是iter(a), iter(a) 的用法會產生兩個 iterator 07/17 11:09
SansWord:這種包法必須要兩個參數是同一個 reference 才行。 07/17 11:09