2014-11-18 2 views
0

Так что я думал, что, возможно, захочу сделать это, но потом понял, что мне это не нужно, поскольку он ничего не добьется. И на данный момент я не могу думать о причине, которая вам может понадобиться, поэтому это больше вопрос любопытства.Python динамически меняет порядок вложенных циклов

Есть ли способ изменить порядок выполнения набора вложенных циклов?

например;

Say я имел что-то вроде:

for j in js: 
    for k in ks: 
    for l in ls: 
     #do something 

Есть ли способ, что я мог бы динамически поменять for j in ... и for k in ... линии, чтобы изменить порядок, что все делается в главном теле цикла?

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

variable_lists_list = [js, ks, lk] 
for a in variable_lists_list[preference1]: 
    for b in variable_lists_list[preference1]: 
    for c in variable_lists_list[preference1]: 
     #Do something 

Но есть аккуратнее путь, который позволит мне использовать j,k,l и не придется беспокоиться, что есть на самом деле не из соответствующих списков js, ks, ls?

Чем больше я думаю об этом, тем больше я думаю, что если вам нужно использовать конструкцию, подобную этой, вы должны, вероятно, переосмыслить проблему, поскольку она просто сбивает с толку, но все же я нажимаю. Это возможно?

Ситуация, из-за которой я изначально думал о том, где это может быть полезно, было бы, когда вырваться из циклов произойдет рано из-за чего-то, возможно, если вы что-то искали и имели некоторые знания, которые могли бы помочь вам решить, какие переменные перейдем к предпочтению. Помимо чего-то подобного, есть ли какая-то ситуация, когда такая система была бы полезной?

+1

Я предполагаю, что вы ищете 'itertools.product' здесь. – georg

+0

@georg - я думаю, после этого я мог бы сортировать наборы, если 'j, k, l' предпочтительно предназначаться для различных ситуаций. – will

+0

добавлен пример. – georg

ответ

0

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

if SOMECONDITION1: 
    target1 = js 
    target2 = ks 
    target3 = ls 
elif SOMECONDITION2: 
    target1 = ks 
    target2 = ls 
    target3 = js 
elif SOMECONDITION3: 
    target1 = ls 
    target2 = js 
    target3 = ks 

for j in js: 
    for k in ks: 
    for l in ls: 
0

Вот пример того, как упростить, что использование itertools.product:

from itertools import product 

a = [1,2,3] 
b = 'abc' 
c = ['foo', 'bar', 'baz'] 

if <some condition>: 
    lists = a, b, c 
else: 
    lists = c, a, b 

for x,y,z in product(*lists): 
    print x,y,z 
+0

Это не то, что я имел в виду использовать 'products', так как теперь в цикле должна быть какая-то логика, чтобы определить, являются ли' x, y, z' частью 'a, b,' или 'c'. Я имел в виду нечто вроде 'для j, k, l в сортировке (product (js, ks, ls), key = someFunction):' - где 'someFunction' сортирует их в зависимости от обстоятельств. – will