Опытный разработчик, изучающий Python.Переменные уровни вложенных циклов с внутренними разрывами с использованием Itertools
Я выполняю итерацию через комбинации k за раз из списка размера n. Я использую
from itertools import chain, combinations
for subset in (combinations(range(n), k)) :
doSomethingWith(subset)
Теперь проблема заключается в том, что большую часть времени мой doSomethingWith() 's не являются продуктивными, и я хотел бы, чтобы пропустить как многие из них, как я могу. И если doSomthingWith() терпит неудачу для данного подмножества, я могу пропустить каждое подмножество, самая правая координата которого больше. Другими словами, если это не удается для (1,3,5,8), то следующее подмножество, на которое я хочу обратить внимание, это (1,3,6,0), пропуск (1,3,5,9), (1, 3,5,10) и т. Д.
Я понял, что мне нужно получить явный контроль индексов цикла. Мне нужно переменное число вложенных циклов, используя рекурсию или итерацию. Перед тем, как кодировать это, я разобрался и нашел this thread, который выглядит многообещающим.
Так что теперь у меня есть:
from itertools import product, repeat
set = range(n)
sets = repeat(set, k)
for subset in list(product(*sets)) :
doSomethingWith(subset)
Красиво вещий, но я до сих пор с той же проблемой. У меня нет возможности сказать product(), когда вырваться из самого внутреннего цикла. Я действительно хочу, чтобы иметь возможность передать функцию обратного вызова в product(), чтобы он мог выполнять и, возможно, выходить из самого внутреннего цикла.
Любые предложения Pythonic? Мне не хотелось бы явно указывать переменные вложенные циклы или перебирать результат из product() и проверять подмножества вручную. Это кажется такой старой школой :-)
Не делайте 'для подмножества в списке (продукт (* наборы)):' ... уйти из 'list', что заставляет вас материализовать весь «продукт» в память и избегает эффективности памяти лениво итерации над «продуктом». Поскольку вы не поддерживаете его, это просто бессмысленно неэффективно. –
Если вы используете itertools, такие как 'product' или' combination', они всегда будут генерировать все комбинации. Вы не можете заставить его сделать внутренний 'break'. * Вы можете пропускать комбинации, сохраняя «неудачные» случаи, проверяя последний элемент и используя 'continue' для перехода к следующему, но вы все равно будете получать каждый элемент. – BrenBarn
Я до сих пор не понимаю, как использование 'product' помогает вообще. –