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。
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个或更多元素的
1 2 | >>> [list(t) for t in zip(*4*[iter(x)])] [[0, 1, 2, 3], [4, 5, 6, 7]] |
如果你觉得埃多克斯1〔3〕有点奇怪(我第一次看到它的时候,它就对我产生了影响!),看看
另请参阅这个成对的实现,我认为它非常整洁。
输入:
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]] |
对于一些列表任务,您可以使用