从列表中获取两元组

c08*_*089 3 python

我只是使用python从列表中提取了一些数据,但认为它过于复杂和unpythonic,并且可能有更好的方法来做到这一点.我其实很确定我在标准库文档中看到了这个,但我的大脑拒绝告诉我在哪里.

所以这里:

输入:

x = range(8) # any even sequence
Run Code Online (Sandbox Code Playgroud)

输出:

[[0, 1], [2, 3], [4, 5], [6, 7]]
Run Code Online (Sandbox Code Playgroud)

我的看法:

[ [x[i], x[i+1]] for i in range(len(x))[::2] ]
Run Code Online (Sandbox Code Playgroud)

Joh*_*web 7

元组?

在Python 2 ñ

>>> zip(*2*[iter(x)])
[(0, 1), (2, 3), (4, 5), (6, 7)]
Run Code Online (Sandbox Code Playgroud)

在Python 3 ñ

zip() 行为略有不同......

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

名单?

Python 2和3中的实现是相同的......

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

或者,或者:

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

如果你想分成list3个或更多元素的s而不拼写出来,后者更有用,例如:

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

如果你zip(*2*[iter(x)])看起来有点奇怪(我第一次看到它的时候它就对我做了!),看看如何zip(*[iter(s)]*n)在Python 中工作?.

另见这种成对实现,我认为它非常整洁.