从列表中获取二元组
我刚用Python从一个列表中提取了一些数据,但觉得这个方法太复杂了,不够Python风格,可能还有更好的办法。我其实很确定在标准库的文档里见过类似的内容,但我的脑袋就是想不起来在哪儿。
下面是我的代码:
输入:
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 个回答
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]]
1
如果你想要元组而不是列表,可以试试:
>>> zip(range(0, 8, 2), range(1, 8, 2))
[(0, 1), (2, 3), (4, 5), (6, 7)]
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)])
看起来有点奇怪(我第一次看到的时候也觉得很奇怪!),可以看看 这个问题,了解 zip(*[iter(s)]*n)
在 Python 中是怎么工作的?。
另外也可以看看 这个成对实现,我觉得挺不错的。