Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 笛卡尔积与重复_Python_Python 3.x_Combinatorics - Fatal编程技术网

Python 笛卡尔积与重复

Python 笛卡尔积与重复,python,python-3.x,combinatorics,Python,Python 3.x,Combinatorics,所以我想做一个函数,它接受正整数n,并返回一堆

所以我想做一个函数,它接受正整数
n
,并返回一堆
,填充所有可能的
真/假(1/0)
,例如:

f(1) = (0,),(1,)


f(2) = (0, 0), (0, 1), (1, 0), (1, 1)
我的代码是:

def fill(n: int) -> Tuple[Tuple[int]]:
    if n == 1:
        return (0,),(1,)
    return tuple((i + j) for i in fill(n-1) for j in fill(1))
我听说python不太擅长递归,通常认为这不是有效的解决方案

这就像使用给定数字范围内的powerset(powerset的配方来自
itertools
模块),然后使用某种类型的powerset就可以做到这一点

from itertools import chain, combinations

def range_powerset(n: int):
    s = list(range(n))
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

def indicator(A: Iterable, B: Iterable):
    return tuple(i in A for i in B)

def fill2(n: int):
    return (indicator(i, range(n)) for i in range_powerset(n))
然而,对于一件非常基本的事情来说,这似乎是太多的工作了。
有更好的方法吗?

您所描述的不是动力装置,而是笛卡尔的重复产品。使用:


你有没有读过这个问题可能最适合的副本。对knelwood说:什么不是动力集?如果你指的是主题的名称,我选择它是因为没有更好的名称,如果你能提出其他建议,我会很高兴。如果你是指我定义的函数range\u powerset,它返回的基本上是一个powerset,这里没有错。感谢你的提醒,我错过了什么吗?我把powerset的配方带到了那个里,但它并不是我任务的一个解决方案,还有一个可能的重复,谢谢,若并没有人介意的话,我会相应地重命名这个问题
import itertools
def fill(n):
    return itertools.product((0,1), repeat=n)

print(list(fill(3)))

# [(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]