从列表中获取二元组

3 投票
4 回答
3833 浏览
提问于 2025-04-16 17:39

我刚用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 中是怎么工作的?

另外也可以看看 这个成对实现,我觉得挺不错的。

撰写回答