【问题标题】:Descartes product with repetition笛卡尔积与重复
【发布时间】:2016-11-22 09:35:53
【问题描述】:

所以我想创建一个函数,它接受正整数 n 并返回一堆 n-tuples,其中填充了 True/False (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 模块)然后使用某种 Indicator function 就可以了。

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))

然而,对于一件非常基本的事情来说,这似乎工作量太大了。 有没有更好的方法?

【问题讨论】:

标签: python python-3.x combinatorics


【解决方案1】:

您所描述的不是幂集,而是具有重复性的笛卡尔积。使用itertools.product

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

【讨论】:

  • 谢谢,如果没有人介意我相应地重命名问题
猜你喜欢
  • 2012-02-24
  • 2011-09-18
  • 2016-06-26
  • 1970-01-01
  • 2023-04-09
  • 2014-06-18
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
相关资源
最近更新 更多