2013-08-01 2 views
0

Случай: Мне нужно выяснить, будет ли три комбинации объектов удовлетворять правилу.Итерация по переменному числу итераций в Python

Для простоты предположим, что правило выполняется, если заданная последовательность находится в любой комбинации элементов, которые выплевываются функцией генератора. Генератор обрабатывает то, что элементы из пула выскочит в каждом из его экземпляров и не всегда будет давать одинаковые элементы/порядок, поэтому создание списка элементов и использование чего-то типа itertools.combinations для создания комбинаций не сработает.

Прямо сейчас у меня есть функция, эквивалентный:

def is_match_found(sequence): 

    items1 = items_generator() 

    for item1 in items1: 
    items2 = items_generator() 

    for item2 in items2: 
     items3 = items_generator() 

     for item3 in items3: 
     if sequence in [item1, item2, item3]: 
      return True 

    return False 

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

Я чувствую, что функция с параметром n, который реализует рекурсивные петли for, может стать шагом на пути к решению этой проблемы, но мой мозг ломается, когда я пытаюсь сделать правильный эффективный.

Может кто-нибудь указать мне в правильном направлении?

+1

Вы просто ищете 'itertools.product', или я что-то упустил? – abarnert

+0

, кажется, правильный инструмент для работы, я попробую, когда я буду перед компьютером. Спасибо! – thismachinechills

ответ

0

Для перестановки N-многих элементов:

def is_match_found(sequence): 
    for itemList in itertools.product(list(item_generator()), repeat=N): 
     if sequence in itemList: 
      return True 
    return False 
+1

Параметр 'repeat' для' product' - только для ключевого слова, поэтому он попытается обработать 'N' как еще один итерабельный, который я не думаю, что вы хотите. – abarnert

0

Если вы ищете «функции с n параметром, который реализует рекурсивные for петли», и «рекурсивный» вы на самом деле имеете в виду «вложенными «... тогда это уже существует: itertools.product. На самом деле, краткое описание даже:

декартово произведение, что эквивалентно вложенный для цикла

Но это не имеет n параметра; он имеет параметр iterables, который позволяет указать столько отдельных итераций, сколько нужно. Если вы хотите вложить только одно и то же число: n раз, вы можете передать список n копий одного итерабельного ... но вы также можете просто использовать ключевое слово repeat, чтобы указать это. Как говорят документы:

product(A, repeat=4) означает то же, что и product(A, A, A, A).

Смежные вопросы