将大小为 n 的二进制数生成为元组:itertools.product(*[(0, 1)] * n)

Posted

技术标签:

【中文标题】将大小为 n 的二进制数生成为元组:itertools.product(*[(0, 1)] * n)【英文标题】:generating binary numbers of size n as tuples : itertools.product(*[(0, 1)] * n) 【发布时间】:2013-05-02 03:56:18 【问题描述】:

我刚刚找到了这个说明

itertools.product(*[(0, 1)] * n)

由 PAG 发布。

有人能解释一下它是如何工作的吗?

我正在尝试找到一种在不重复 3 个袋子中的 n 个元组的情况下进行排列的方法 如果我愿意,我只能使用 itertools。谢谢

【问题讨论】:

zip(*[iter(seq)]*3) 例如将一个序列分成 3 个一组,这是一个合适的用例。 product 接受 repeat 参数,该参数使此代码无用。 【参考方案1】:

[(0, 1)] 是由数字 01 组成的单个元组的列表。

[(0, 1)] * n 复制列表中的元组,所以我们得到

[(0, 1), (0, 1), ..., (0, 1), (0, 1)]

然后,如果我们查看itertools.product 函数,我们希望将每个元组作为单个参数传递。因此,我们使用*-操作符将我们的列表解压缩为itertools.product 函数的参数。所以,我们的函数相当于:

itertools.product((0, 1), (0, 1), ..., (0, 1), (0, 1))

计算n0s 和1s 的所有排列。

注意itertools.product 带有一个repeat 参数,应该使用它来做这种事情:

itertools.product((0, 1), repeat=n)

要做排列,你可以使用itertools.permutations函数:

def pick_into_three_bags(n):
    return itertools.permutations(range(n), 3)

【讨论】:

请注意使这段代码无用的重复参数 谢谢,但我不能重复排列。 @user1347096 如果您在我的回答中使用该功能,它不会重复。例如,pick_into_three_bags(3) 中的第一个元素将是 (0, 1, 2) 对不起,这不是我想要的,我可能不清楚,昨天我无法测试你的解决方案。如果我有元素a,b,c。我想找到将这些物品放入 3 个袋子的所有可能性,所以我应该有 [(),(),(a,b,c)], [(a,b),(c),()], [(a),(b,c),()] 等等...() 描述一个包的内容 @user1347096 啊,我明白你的意思了。等等,让我看看有没有函数可以做这种事情。

以上是关于将大小为 n 的二进制数生成为元组:itertools.product(*[(0, 1)] * n)的主要内容,如果未能解决你的问题,请参考以下文章

如何从记录转换为元组?

tuple()

如何将列表项分组为元组? [复制]

无法为元组列表中的数据返回无

pandas使用pd.MultiIndex.from_tuples函数生成多层索引结构(MultiIndex)tuples参数指定输入数据为元组列表(列表中包含多个元组)

pandas使用pd.MultiIndex.from_tuples函数生成多层索引结构(MultiIndex)tuples参数指定输入数据为元组列表(列表中包含多个元组)