2013-10-14 46 views
0

我正在嘗試查找集合的所有子集並將它們打印到列表中。 但是,我目前遇到了這個錯誤。集合的所有子集append Nonetype Error

錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "subset_of_set.py", line 15, in <module> 
    print subsets(a) 
    File "subset_of_set.py", line 9, in subsets 
    return subsets(setys, count + 1, main_list.append(sublist)) 
    File "subset_of_set.py", line 9, in subsets 
    return subsets(setys, count + 1, main_list.append(sublist)) 
AttributeError: 'NoneType' object has no attribute 'append' 

但是,當我的翻譯測試.append,似乎罰款。

>>> f = [] 
>>> f.append(3) 
>>> f 
[3] 

有可能是我失蹤或不知道的東西。有人可以解釋嗎?謝謝!

我的代碼:

def subsets(setys, count = 1,main_list = []): 
    set_to_list = list(setys) 
    length_of_set = len(setys) 
    sublist = [] 
    if count == length_of_set: 
     return set(main_list) 
    for n in set_to_list[:count]: 
     sublist.append(n) 
    return subsets(setys, count + 1, main_list.append(sublist)) 


a = [3,5,3,2,5,7,34,2,54,6,7,1,1,1,0,None,3,99,9] 
a = set(a) 

print subsets(a) 
+2

'main_list.append(sublist)'是'None',所以你實際上將'None'傳遞給'subsets'而不是修改'main_list'。並使用[可變的默認參數是一個壞主意](http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument)。 –

+0

當我向'sublist'追加'set_to_list'的第一個值時,'main_list.append(suiblist)'是'None'怎麼辦? – Liondancer

回答

2

兩件事情在這裏錯了:

首先

return set(main_list) 

使用:return main_list來代替。

對於設置哪個需要可排列類型,哪個列表不可以,因爲列表是可變的。你也可以在這裏使用一個元組,這是不可變的。

另一個

您不能追加,並在同一時間main_list的引用傳遞到遞歸。因此,像:

main_list.append(sublist) 
    return subsets(setys, count + 1, main_list) 

會爲你工作。

輸出:

[] 
[[0]] 
[[0], [0, 1], [0, 1]] 
[[0], [0, 1], [0, 1], [0, 1, 34], [0, 1, 34], [0, 1, 34]] 
[[0], [0, 1], [0, 1], [0, 1, 34], [0, 1, 34], [0, 1, 34], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3]] 
[[0], [0, 1], [0, 1], [0, 1, 34], [0, 1, 34], [0, 1, 34], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5]] 
[[0], [0, 1], [0, 1], [0, 1, 34], [0, 1, 34], [0, 1, 34], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6]] 
[[0], [0, 1], [0, 1], [0, 1, 34], [0, 1, 34], [0, 1, 34], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7]] 
[[0], [0, 1], [0, 1], [0, 1, 34], [0, 1, 34], [0, 1, 34], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9]] 
[[0], [0, 1], [0, 1], [0, 1, 34], [0, 1, 34], [0, 1, 34], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2]] 
[[0], [0, 1], [0, 1], [0, 1, 34], [0, 1, 34], [0, 1, 34], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None]] 
[[0], [0, 1], [0, 1], [0, 1, 34], [0, 1, 34], [0, 1, 34], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99]] 
[[0], [0, 1], [0, 1], [0, 1, 34], [0, 1, 34], [0, 1, 34], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99], [0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99]] 

編輯

添加到您的return語句:

final_set = set() 
     for item in tuple(main_list): 
      final_set.add(tuple(item)) 
     return list(final_set) 

最終輸出:

[(0, 1), (0,), (0, 1, 34, 3, 5, 6, 7, 9, 2, None, 99), (0, 1, 34), (0, 1, 34, 3, 5, 6, 7, 9, 2), (0, 1, 34, 3, 5), (0, 1, 34, 3, 5, 6, 7), (0, 1, 34, 3, 5, 6, 7, 9), (0, 1, 34, 3, 5, 6), (0, 1, 34, 3, 5, 6, 7, 9, 2, None), (0, 1, 34, 3)] 
+0

這是非常正確的,但最後還是有許多相同子集的實例。我希望能夠返回每個可能的子集一次。我試過'new_set = set((main_list))',然後在那行'return new_set'下面。但我得到相同的錯誤=/ – Liondancer

+0

你可以創建一個聊天... – Vivek

+0

不知道如何=// – Liondancer

2

return subsets(setys, count + 1, main_list.append(sublist))確實是在您的錯誤。考慮將其更改爲類似

main_list.append(sublist) 
return subsets(setys, count + 1, main_list) 
+0

現在我得到'TypeError:不可用類型:'列表''感謝您的輸入,它實際上幫助了很多。 – Liondancer

+0

@Liondancer你仔細閱讀我的評論? *不要使用**可變**默認參數*。 –