2012-12-02 26 views
0

我希望它把一組數字作爲輸入,比如[1,2,3,4],並且只給出奇數和的子集。例如,[1],[1,2],[2,3]等。修改這個Python程序只生成奇數和子集?

我還沒有嘗試太多,我不知道從哪裏開始。對不起,我對編程非常陌生,但這是迄今爲止我所擁有的。它會生成所有可能的子集。

def rsubsets(s): 
     if len(s) == 0: 
      return [[]] 
     temp = rsubsets(s[1:]) 
     new = [] 
     for itm in temp: 
      new.append(itm) 
     n = len(new) 
     for j in range(n): 
      new[j] = new[j] + [s[0]] 
     return temp + new 

謝謝。

+1

爲什麼不帶返還您生成的所有子集的值,然後檢查是否有奇數? – inspectorG4dget

+0

只在標題的末尾加上一個問號並不構成問題。 –

+0

嘗試itertools.combinations – tdihp

回答

1
def odd_subsets(s): 
    lRet = [] 
    for i in range(len(s)): 
     lRet.extend([c for c in itertools.combinations(s,i+1) if sum(c)%2==1]) 
    return lRet 

如果您在使用您的初始功能死心塌地這是把它關閉

def rsubsets(s): 
    def all_subsets(s): 
     if len(s) == 0: 
      return [[]] 
     temp = all_subsets(s[1:]) 
     new = [] 
     for itm in temp: 
      new.append(itm) 
     n = len(new) 
     for j in range(n): 
      new[j] = new[j] + [s[0]] 
     return temp + new 
    return [i for i in all_subsets(s) if sum(i)%2==1] 

最簡單的方法差不多就是這樣做是叫你最初的遞歸函數和過濾結果。

另一種方法是使用一個標誌......在現有的功能

def rsubsets(s,bFilter=True): 
    if len(s) == 0: 
     return [[]] 
    temp = rsubsets(s[1:],False) 
    new = [] 
    for itm in temp: 
     new.append(itm) 
    n = len(new) 
    for j in range(n): 
     new[j] = new[j] + [s[0]] 
    if bFilter: 
     return [i for i in temp+new if sum(i)%2 ==1] 
    return temp + new 
3

體形:

def odd_subsets(s): 
    return [x for x in rsubsets(s) if sum(s) % 2 == 1] 

或不理解:

def odd_subsets(s): 
    odd = [] 
    for subset in rsubsets(s): 
     if sum(s) % 2 == 1: 
      odd.append(subset) 
    return odd 
+0

我該如何把它放在同一個函數中? – user1871071

+0

@ user1871071:你爲什麼想要? – Eric

+0

我的目標是編輯原始函數只輸出具有奇數和的子集。 謝謝 – user1871071