[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)]
答案 0 :(得分:12)
您可以使用zip与slicing相结合来创建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)]
这背后的过程非常简单。我们首先使用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])
答案 1 :(得分: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
尝试从每个参数中获取一个值。但事实证明,所有参数实际上都是相同的迭代器,因此每次都会产生一个新值。
答案 2 :(得分: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)]
答案 3 :(得分: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)]