2013-08-01 91 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'參數僅爲關鍵字,因此這會嘗試將'N'視爲另一個迭代器,我不認爲它是您想要的。 – abarnert

0

如果你要尋找的「以實現遞歸for循環的n參數的函數」,並通過「遞歸」你實際上意味着「嵌套「...那麼已經存在:itertools.product。事實上,簡短說明是偶數:

笛卡兒積,相當於一個嵌套for循環

但它不具有n參數;它有一個iterables參數,它允許您指定儘可能多的單獨迭代以根據需要進行嵌套。如果你只是想嵌套相同的迭代n次,你可以通過n副本的列表相同的迭代......但你也可以只使用repeat關鍵字來指定。如文檔所述:

product(A, repeat=4)的含義與product(A, A, A, A)相同。