как преобразовать список int в список кортежей - PullRequest
4 голосов
/ 29 октября 2009

Я хочу преобразовать такой список

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 ]

10 голосов
/ 29 октября 2009

Один хорошо путь:

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

Выход:

1 2
3 4
>>> 
7 голосов
/ 29 октября 2009

Опираясь на ответ Ника 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
>>>

Не совсем так легко читается, но показывает компактный способ получить любой размер кортежа.

5 голосов
/ 29 октября 2009

Легко с оператором нарезки Python:

l2 = zip(l1[0::2], l1[1::2])
2 голосов
/ 29 октября 2009

Посмотрите на функцию группирования из документов itertools .

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)
0 голосов
/ 29 октября 2009
 list = [1,2,3,4,5,6]
 it = iter(list)
 newlist = [(x, y) for x, y in zip(it, it)] 
0 голосов
/ 29 октября 2009

Нет необходимости создавать новый список. Вы можете просто перебрать список по шагам 2 вместо 1. Я использую len(L) - 1 в качестве верхней границы, чтобы вы не пытались получить доступ за концом списка.

for i in range(0, len(L) - 1, 2):
    draw_thing(L[i], L[i + 1])
0 голосов
/ 29 октября 2009

Не самое элегантное решение

l2 = [(l1[i], l1[i+1]) for i in xrange(0,len(l1),2)]
0 голосов
/ 29 октября 2009

Вы можете сделать:

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

Я не проверяю, чтобы убедиться, что в l1 есть четное количество записей и тому подобное.

0 голосов
/ 29 октября 2009

Что плохого в том, чтобы просто получить правильный индекс и увеличить его? for (int i=0;i<myList.Length;i++) { draw_thing(myList[i],myList[++i]); }

Упс - извините, в режиме C #. Я уверен, что вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...