[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)]
[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)]
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]
print zip(my_list[0::2], my_list[1::2])
>>> 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
尝试从每个参数获取一个值。但是事实证明,所有的参数都是同一个迭代器,因此它每次都会产生一个新值。
zip
从左到右获取迭代器的值这一事实,考虑到其输出可能是合理的,但实际上这是一项实现细节。 - Thijs van Dienlst = [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)]