我想转换像这样的列表
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)
答案 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#模式下。我相信你明白了。