所有子集的集合

13

在Python2中,我可以使用

def subsets(mySet):
    return reduce(lambda z, x: z + [y + [x] for y in z], mySet, [[]])

找到mySet的所有子集。Python 3已删除reduce

那么,有没有同样简洁的重写方法可以用于Python 3呢?


5
reduce() 仍然存在 -- 它被移动到 functools 模块中。 - Sven Marnach
1
@SvenMarnach:啊,谢谢。有没有非reduce()版本的? - Randomblue
6
虽然不是一行代码,但是itertools文档中有一个幂集的实现。 - AdamKG
@AdamParkin:谢谢。chain这个词从哪里来的? - Randomblue
@Randomblue,如果您能解释一下这段代码,那就太好了。谢谢! - Ayush
显示剩余2条评论
2个回答

14

以下是Python中幂集(所有子集的集合)算法的几种可能实现的列表。有些是递归的,有些是迭代的,其中一些不使用reduce。有很多选择!


5

函数reduce()总是可以用一个for循环来代替。下面是一个Python实现reduce()的例子:

def reduce(function, iterable, start=None):
    iterator = iter(iterable)
    if start is None:
        start = next(iterator)
    for x in iterator:
        start = function(start, x)
    return start

与Python内置的reduce()相比,这个版本不允许将None作为start参数传入。
将您传递给reduce()的参数与特殊情况的代码相对比得到以下结果。
def subsets(my_set):
    result = [[]]
    for x in my_set:
        result = result + [y + [x] for y in result]
    return result

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接