我刚刚使用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] ]
答案 0 :(得分:7)
>>> zip(*2*[iter(x)])
[(0, 1), (2, 3), (4, 5), (6, 7)]
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
,但我很确定这个没有帮助函数。