将整数列表转换为元组列表 Python

6

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


相关:https://dev59.com/lnVC5IYBdhLWcg3wYQAp - Jon Clements
这个相关问题是关于生成一个列表的列表,所以它不是完全重复,但非常接近,并且很容易适应。 - oefe
4个回答

12
你可以使用zipslicing结合起来创建一个新的list,其中包含tuples
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)]

这背后的过程非常简单。我们首先使用切片将现有列表分成两个新列表。
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])

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 创建一个由两个相同迭代器组成的列表。

* 在参数的第一位用于解包参数,因此 zip(*[it]*2) 变成了 zip(it,it)。虽然你可以使用 zip(it,it),但是 zip(*[it]*2) 是一个更通用的构造,可以扩展到结果元组中的任意数量的值。

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


超级聪明!!为此加1分。但是那些试图理解包括这些代码行的代码的人则更糟糕。 - Niklas R
@NiklasR 是的,我一直在打完答案核心后写解释。 - ovgolovin
看起来很不错,但不幸的是它依赖于zip从左到右获取迭代器的值这一事实,考虑到其输出可能是合理的,但实际上这是一项实现细节。 - Thijs van Dien

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)]

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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接