关于python:从列表中获取两元组

Getting two-tuples out of a list

我刚刚使用python从列表中提取了一些数据,但我认为它过于复杂和不太理想,而且可能有更好的方法来实现这一点。实际上,我很确定我在标准的图书馆文档中看到了这个,但是我的大脑拒绝告诉我在哪里。

接下来是:

输入:

1
x = range(8) # any even sequence

输出:

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

我的拿手:

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


Tuples?在Python 2。

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

在Python 3。

zip()的行为略有不同…

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

名单?

在python 2和3中实现是相同的…

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

或者,或者:

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

如果您想拆分为包含3个或更多元素的list,而不需要拼写出来,例如:

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

如果你觉得埃多克斯1〔3〕有点奇怪(我第一次看到它的时候,它就对我产生了影响!),看看zip(*[iter(s)]*n)在Python中是如何工作的?.

另请参阅这个成对的实现,我认为它非常整洁。


输入:

1
x = range(8) # any even sequence

解决方案:

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

输出:

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


如果要用元组而不是列表,可以尝试:

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

你可以重写一下:

1
2
3
>>> 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,但我很确定这个任务没有助手功能。