пропуски вперед - PullRequest
       3

пропуски вперед

5 голосов
/ 16 ноября 2010

У меня есть список списков.Используя itertools, я в основном выполняю

для результата в продукте ([A, B], [C, D], [E, F, G]): # тестируем каждый результат

ирезультат - желаемый продукт, каждый из которых содержит один элемент из каждого списка.Мой код тестирует каждый из результатов поэлементно, ища первый (и лучший) «хороший».Может быть очень очень большое число для тестирования.

Допустим, я тестирую первый результат «ACE».Допустим, когда я тестирую второй элемент «C», я нахожу, что «ACE» - плохой результат.Нет необходимости проверять «ACF» или «ACG».Я хотел бы перейти от неудачного ACE непосредственно к попытке ADE.В любом случае, чтобы сделать это, не выбрасывая нежелательные результаты на пол?

Если бы я реализовывал это с помощью вложенных циклов for, я бы пытался манипулировать индексами цикла for внутри цикла, и это было бы не очень хорошо... но я хочу пропустить тестирование многих результатов.Могу ли я эффективно пропустить вперед в itertools?

1 Ответ

1 голос
/ 16 ноября 2010

itertools - не лучший способ справиться с вашей заботой.

Если у вас есть только 3 комплекта для объединения, просто зациклитесь, а когда вы потерпите неудачу, разорвите петли. (Если код сложный, установите переменную и прервитесь прямо на улице.

for i1 in [A, B]:
  for i2 in [C, D]:
      for i3 in [E, F, G]:
         if not test(i1, i2, i3):
           break

Однако, если количество ваших наборов является переменным, используйте рекурсивную функцию (возврат):

 inp_sets = ([A,B],[C,D],[E,F,G])
 max_col = len(inp_sets)
 def generate(col_index, current_set):
     if col_index == max_col:
         if test(current_set):
             return current_set
         else:
             return None
     else:
         found = False
         for item in inp_sets[col_index]:
             res = generate(col_index+1, current_set + [item]):
             if res:
                  return res
             elif (col_index == max_col - 1):
                  # Here we are skipping the rest of the checks for last column
                  # Change the condition if you want to skip for more columns
                  return None

result = generate(0, [])
...