6

[1, 109, 2, 109, 2, 130, 2, 131, 2, 132, 3, 28, 3, 127]我有这个数组,我想把它变成一个元组列表,每个元组有 2 个值。所以这个列表变成[(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]

4

4 回答 4

12

您可以使用zip结合切片来创建一个新的元组列表

my_new_list = zip(my_list[0::2], my_list[1::2])

这将生成一个具有以下输出的新列表

[(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]

这背后的过程非常简单。我们首先使用slicing将现有列表拆分为两个新列表。

print my_list[0::2] # [1, 2, 2, 2, 2, 3, 3]
print my_list[1::2] # [109, 109, 130, 131, 132, 28, 127]

然后使用zip将这两个列表组合成一个元组列表。

print zip(my_list[0::2], my_list[1::2])
于 2013-04-06T14:55:21.297 回答
9
>>> it = iter(L)
>>> zip(*[it]*2)
[(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]

解释

it = iter(L)在初始列表上创建迭代器

[it]*2两次 crates 由相同迭代器组成的列表。

*参数中最先使用的用来解包参数,这样就zip(*[it]*2)变成了zip(it,it). 尽管您可以使用zip(it,it),zip(*[it]*2)是一种更通用的结构,它可以扩展到结果元组中的任意数量的值。

这种方法的核心是zip在每次迭代中尝试从每个参数中获取一个值。但事实证明,所有参数实际上都是同一个迭代器,因此它每次都会产生一个新值。

于 2013-04-06T14:54:11.847 回答
2

另一种方法:

lst = [1, 109, 2, 109, 2, 130, 2, 131, 2, 132, 3, 28, 3, 127]

print [(lst[i], lst[i + 1]) for i in xrange(0, len(lst), 2)]
#[(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]
于 2013-04-06T15:16:11.553 回答
0

受 ovgolovin 回答的启发:

>>> it=iter(L)
>>> [(el, next(it)) for el in it]
[(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]

可能更容易看到它是如何工作的。还可以反转元组顺序:

>>> it=iter(L)
>>> [(next(it), el) for el in it]
[(109, 1), (109, 2), (130, 2), (131, 2), (132, 2), (28, 3), (127, 3)]
于 2013-07-09T18:09:48.207 回答