2011-05-15 77 views
3

我剛剛使用python從列表中提取了一些數據,但認爲這是過度複雜和不合理的,並且可能有更好的方法來完成此操作。我確實很確定我在標準庫文檔的某個地方看到了這一點,但我的大腦拒絕告訴我在哪裏。從列表中獲取兩元組

所以這裏有雲:

輸入:

x = range(8) # any even sequence 

輸出:

[[0, 1], [2, 3], [4, 5], [6, 7]] 

我的看法:

[ [x[i], x[i+1]] for i in range(len(x))[::2] ] 
+0

你說二元組,但你的例子是「雙列表」 – 2011-05-15 10:14:09

+1

重複(很多次):http://stackoverflow.com/questions/434287/what-is-the-most-pythonic-way-重複列表塊 – tokland 2011-05-15 10:15:14

+0

當然,糟糕的是混淆。儘管這個問題並不重要;) – c089 2011-05-15 10:28:43

回答

7

元組?

在Python 2 ň

>>> zip(*2*[iter(x)]) 
[(0, 1), (2, 3), (4, 5), (6, 7)] 

在Python 3 ň

zip()表現略有不同...

>> zip(*2*[iter(x)]) 
<zip object at 0x285c582c> 
>>> list(zip(*2*[iter(x)])]) 
[(0, 1), (2, 3), (4, 5), (6, 7)] 

名單?

執行是在Python 2和3一樣的...

>>> [[i,j] for i,j in zip(*2*[iter(x)])] 
[[0, 1], [2, 3], [4, 5], [6, 7]] 

,或者:

>>> [list(t) for t in zip(*2*[iter(x)])] 
[[0, 1], [2, 3], [4, 5], [6, 7]] 

,如果你想分成list S的3後者是更有益或多種元素,而不拼寫出來,如:

>>> [list(t) for t in zip(*4*[iter(x)])] 
[[0, 1, 2, 3], [4, 5, 6, 7]] 

如果zip(*2*[iter(x)])對你來說看起來有點奇怪(當我第一次看到它時,它確實對我有用!),看看How does zip(*[iter(s)]*n) work in Python?

另請參閱this pairwise implementation,我認爲它很整潔。

+0

這實際上非常優雅(但有點難以閱讀)。感謝所有的答案,學到了很多:) – c089 2011-05-15 13:46:42

+0

我發現'zip(* [iter(s)] * n)'相當醜陋,但這個習語是在[文檔](http://docs.python.org/ library/functions.html#zip),所以我猜它是Pythonic。對於對,我喜歡我鏈接到的'pairwise()'版本。 [美麗勝於醜陋](http://www.python.org/dev/peps/pep-0020/),對不對? – Johnsyweb 2011-05-15 21:43:39

0

你可以把它改寫了一下:

>>> l = range(8) 
>>> [[l[i], l[i+1]] for i in xrange(0, len(l), 2)] 
[[0, 1], [2, 3], [4, 5], [6, 7]] 

對於一些列表任務,你可以使用itertools,但我很確定這個沒有幫助函數。

1

如果你想元組而不是列表,你可以嘗試:

>>> zip(range(0, 8, 2), range(1, 8, 2)) 
[(0, 1), (2, 3), (4, 5), (6, 7)] 
1

輸入:

x = range(8) # any even sequence 

解決方案:

output = [] 
for i, j in zip(*[iter(x)]*2): 
    output.append([i, j]) 

輸出:

print output 
[[0, 1], [2, 3], [4, 5], [6, 7]]