如何将int列表转换为元组列表

时间:2009-10-29 18:29:40

标签: python

我想转换像这样的列表

l1 = [1,2,3,4,5,6,7,8]

l2 = [(1,2),(3,4),(5,6),(7,8)]

因为想循环

for x,y in l2:
    draw_thing(x,y)

9 个答案:

答案 0 :(得分:10)

一个好的方式是:

from itertools import izip
it = iter([1, 2, 3, 4])
for x, y in izip(it, it):
    print x, y

输出:

1 2
3 4
>>> 

答案 1 :(得分:7)

以Nick D的回答为基础:

>>> from itertools import izip
>>> t = [1,2,3,4,5,6,7,8,9,10,11,12]
>>> for a, b in izip(*[iter(t)]*2):
...     print a, b
...
1 2
3 4
5 6
7 8
9 10
11 12
>>> for a, b, c in izip(*[iter(t)]*3):
...     print a, b, c
...
1 2 3
4 5 6
7 8 9
10 11 12
>>> for a, b, c, d in izip(*[iter(t)]*4):
...     print a, b, c, d
...
1 2 3 4
5 6 7 8
9 10 11 12
>>> for a, b, c, d, e, f in izip(*[iter(t)]*6):
...     print a, b, c, d, e, f
...
1 2 3 4 5 6
7 8 9 10 11 12
>>>

不太可读,但它显示了一种获得所需大小元组的简洁方法。

答案 2 :(得分:5)

使用python的切片操作符很容易:

l2 = zip(l1[0::2], l1[1::2])

答案 3 :(得分:2)

itertools docs看一下石斑鱼的功能。

from itertools import izip_longest
def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

在你的情况下使用它:

l1 = [1,2,3,4,5,6,7,8]
for (x, y) in grouper(2, l1):
    draw_thing(x, y)

答案 4 :(得分:0)

你可以这样做:

l2 = []
for y in range(0, len(l1), 2):
    l2.append((l1[y], l1[y+1]))

我没有做任何检查以确保l1具有偶数条目等等。

答案 5 :(得分:0)

不是最优雅的解决方案

l2 = [(l1[i], l1[i+1]) for i in xrange(0,len(l1),2)]

答案 6 :(得分:0)

无需构建新列表。您可以按2而不是1的步长迭代列表。我使用len(L) - 1作为上限,以确保您不会尝试访问列表的末尾。

for i in range(0, len(L) - 1, 2):
    draw_thing(L[i], L[i + 1])

答案 7 :(得分:0)

 list = [1,2,3,4,5,6]
 it = iter(list)
 newlist = [(x, y) for x, y in zip(it, it)] 

答案 8 :(得分:-3)

只是访问正确的索引并递增有什么问题?

for (int i=0;i<myList.Length;i++)
{
  draw_thing(myList[i],myList[++i]);
}

哎呀 - 对不起,在C#模式下。我相信你明白了。