从列表中获取两元组

时间:2011-05-15 10:08:34

标签: python

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

所以这就是:

输入:

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] ]

4 个答案:

答案 0 :(得分:7)

元组?

在Python 2中。 n

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

在Python 3中。 n

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]]

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

>>> [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,我觉得它非常整洁。

答案 1 :(得分:1)

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

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

答案 2 :(得分: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]]

答案 3 :(得分: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,但我很确定这个没有帮助函数。