2010-11-16 78 views
4

我有一個列表的列表。使用itertools,我基本上做Python的itertools跳過提前

爲結果在產物([A,B],[C,d],[E,F,G): #測試每個結果

,其結果是所需的產品,每個結果包含每個列表中的一個元素。我的代碼逐個測試每個結果,尋找第一個(也是最好的)「好」的結果。可以有一個非常大的數字來測試。

假設我正在測試第一個結果'ACE'。比方說,當我測試第二個元素'C'時,我發現'ACE'是一個不好的結果。無需測試'ACF'或'ACG'。我想從失敗的ACE直接跳到嘗試ADE。無論如何要做到這一點,而不只是把不需要的結果扔在地上?

如果我用嵌套for循環實現這個,我會試圖操作循環內的for循環索引,這不會很好......但我想跳過測試很多結果。我可以在itertools中有效地跳過嗎?

+2

如果'C'是一個不好的結果,那麼當你到'BCE'時它仍然是一個不好的結果嗎?一個單獨的元素總是不好的,或者只是當它在某些組合中時? – snapshoe 2010-11-16 04:20:03

+0

@Rod。這是最好的零售商之一__ever__。 – aaronasterling 2010-11-16 04:39:50

+0

個別元素並不差,只有元素組合不好 – Mike 2010-11-16 11:40:40

回答

1

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, []) 
+0

我認爲你是對的 - 我將使用遞歸方法。itertoo ls會讓我消耗一堆輸出,但遞歸方法會讓我控制發生器。 – Mike 2010-11-16 22:25:14