Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将整数列表转换为元组列表_Python_List - Fatal编程技术网

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

Python 将整数列表转换为元组列表,python,list,Python,List,[1,109,2,109,2,130,2,131,2,132,3,28,3,127]我有这个数组,我想把它变成一个元组列表,每个元组有两个值。所以这个列表变成了[(1109),(2109),(2130),(2131),(2132),(3128),(3127)] 解释 it=iter(L)在初始列表上创建迭代器 [it]*2将由同一迭代器组成的列表装箱两次 参数中第一个位置使用的*用于解压参数,以便zip(*[it]*2)变成zip(it,it)。虽然可以使用zip(it,it),zip(*[i

[1,109,2,109,2,130,2,131,2,132,3,28,3,127]
我有这个数组,我想把它变成一个元组列表,每个元组有两个值。所以这个列表变成了
[(1109),(2109),(2130),(2131),(2132),(3128),(3127)]


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

[it]*2
将由同一迭代器组成的列表装箱两次

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

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

您可以使用与组合来创建一个新的

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

[(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]
这背后的过程相当简单。我们首先使用将现有列表拆分为两个新列表

然后使用将这两个列表合并为一个元组列表

print zip(my_list[0::2], my_list[1::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)]

灵感来自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)]

超级聪明+1美元。但是试图理解包含这些行的代码的人的情况更糟。@NiklasR是的,我在键入答案的核心后一直在写解释。它看起来很好,但不幸的是它依赖于这样一个事实,
zip
从左到右取迭代器的值,考虑到它的输出,这可能是合乎逻辑的,但是实际上是一个实现细节。相关的:这个相关的问题是关于生成一个列表列表,所以它不是一个完全重复的列表,但是它非常接近,并且很容易适应
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)]
>>> 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)]