0

I am trying to find all the subsets of a set and print them out to a list. However, I am currently running into this error.

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'

But when I test .append on the interpreter, it seems fine.

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

There is probably something I am missing or not know about. Could someone explain please? thank you!

my code:

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)
thefourtheye
  • 233,700
  • 52
  • 457
  • 497
Liondancer
  • 15,721
  • 51
  • 149
  • 255
  • 2
    `main_list.append(sublist)` is `None`, so you're actually passing `None` to `subsets` instead of a modified `main_list`. And using [mutable default arguments is a bad idea](http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument). – Ashwini Chaudhary Oct 14 '13 at 06:14
  • how come `main_list.append(suiblist)` is `None` when I `append` to `sublist` the first value of `set_to_list`? – Liondancer Oct 14 '13 at 06:19

2 Answers2

2

return subsets(setys, count + 1, main_list.append(sublist)) is indeed where your error is. Consider changing it to something like

main_list.append(sublist)
return subsets(setys, count + 1, main_list)
Synthetica
  • 920
  • 1
  • 8
  • 23
2

Two things are wrong here:

First

return set(main_list)

use: return main_list instead.

For, Set which needs a hashable type, which list is not, since list is mutable. you can also use a tuple here, which is immutable.

Another

You cannot append and pass the reference of main_list to a recursion at the same time. So something like:

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

would work for you.

Output:

[]
[[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]]

EDIT

Add this to your return statement:

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

Final Output:

[(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)]
Vivek
  • 910
  • 2
  • 9
  • 26
  • This is pretty much correct but in the end, there are many instances of the same subset. I want to be able to return every possible subset once. I tried `new_set = set((main_list))` then underneath that line `return new_set`. But i am getting the same error =/ – Liondancer Oct 14 '13 at 06:41
  • Not really sure how to =/ – Liondancer Oct 14 '13 at 06:49