2014-06-04 53 views
0

我一直在考慮,由別人,那我無法理解的代碼行。理解的代碼行

inputString = "[1,2,3,4,5,6,7,8,9,10,11,12]" 

a = inputString[1:-1].split(',') 
z = zip(a[::2],a[1::2]) # this line 
print a 
print z 

我明白split函數以及它是如何工作的。我甚至明白zip函數。我不明白的是a[::2],a(1::2)正在做什麼。我已經嘗試修改這些代碼並獲得不同的結果,但沒有什麼能夠讓我理解修改代碼的功能。我對Python很新,可以使用一些幫助。

典型,未修改從代碼的結果是這樣的:

['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'] 
[('1', '2'), ('3', '4'), ('5', '6'), ('7', '8'), ('9', '10'), ('11', '12')] 

我想獲得的「a」到分成4組而不是兩個組的結果,即:

('1','2','3','4'),('5','6','7','8')....etc. 
+0

請參閱這裏解釋了一大步:http://stackoverflow.com/questions/509211/蟒蛇片,符號 –

+0

你應該看看到['itertools'配方'grouper'(https://docs.python.org/2/library/itertools.html#recipes)... – jonrsharpe

回答

2
z = zip(a[::2],a[1::2]) 

上面一行兩次使用Explain Python's slice notation到步驟通過列表aa[::2]告訴Python獲取a中的所有其他項目。下面是一個演示:

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> lst[::2] # Every other item (every item counting by 2's) 
[1, 3, 5, 7, 9] 
>>> 

a[1::2]告訴Python來獲取所有其他項目中a開始於索引1。下面是一個演示:然後

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> lst[1::2] # Remember that Python indexes start at 0 
[2, 4, 6, 8, 10] 
>>> 

zip被配對,同比增長a[::2]a[1::2]返回在列表中的項目:

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> zip(lst[::2], lst[1::2]) 
[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)] 
>>> 

要獲得四個項目的元組在你的榜樣,您可以使用以下內容:

>>> inputString = "[1,2,3,4,5,6,7,8,9,10,11,12]" 
>>> a = inputString[1:-1].split(',') 
>>> zip(*[iter(a)]*4) 
[('1', '2', '3', '4'), ('5', '6', '7', '8'), ('9', '10', '11', '12')] 
>>> 

您可能還想要閱讀:How does zip(*[iter(s)]*n) work in Python?

+0

只是爲了確保我理解正確。在數字列表中:[1,2,3,4,5,6,7,8,9,10],數字'1'被認爲是索引位置'0'? – SnapperTrx

+0

@SnapperTrx - 是的。 Python索引就像C/C++索引:它們從索引'0'開始。 – iCodez

+0

代替拉鍊,你也可以使用列表理解和枚舉,像這樣:打印[(X,Y)爲X,Y中,如果枚舉(S)X%2!= 0] –

0

如果你要4元組,那麼你需要使用4個參數和4

z = zip(a[::4], a[1::4], a[2::4], a[3::4])