Автоматически вкладывается в циклы в python - PullRequest
2 голосов
/ 24 января 2011

Мне известно, что две коллекции могут быть доступны одновременно с помощью

for i,j in zip([1,2,3],[4,5,6]):
    print i,j

1 4
2 5
3 6

Я хотел бы сделать что-то вроде этого:

for i,j in [[1,2,3],[4,5,6]]:
    print i,j

1 4
1 5
1 6
2 4
2 5
2 6
3 4
3 5
3 6

Я хочу, чтобы python автоматически создавал для меня вложенный цикл for. Я хотел бы избежать использования многих вложенных циклов for в моем коде, когда размер списка достигает 5 или 6. Это возможно?

Ответы [ 3 ]

10 голосов
/ 24 января 2011

Попробуйте

for i, j in itertools.product([1, 2, 3], [4, 5, 6]):
    print i, j
1 голос
/ 24 января 2011
>>> [[x,y] for x in [1,2,3] for y in [4,5,6]]
[[1, 4], [1, 5], [1, 6], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5], [3, 6]]

Должно быть довольно легко получить то, что вы хотите из полученного списка.

0 голосов
/ 24 января 2011

У меня были случаи, когда логика того, что нужно повторять, довольно сложна - так что вы всегда можете разбить эту часть на собственный генератор:

def it():
    i = 0
    for r in xrange(rows):
        for c in xrange(cols):
            if i >= len(images):
                return
            yield r, c, images[i], contents[i]
            i += 1

for r, c, image, content in it():
    # do something...

Но обычно я нахожупростое написание простых вложенных циклов лучше, чем запутывание того, что вы делаете, в вызов другого кода.Если у вас есть более 2-3 вложенных циклов, код, вероятно, все равно нуждается в рефакторинге.

...