从数字集 N 生成长度 k 的组合,顺序很重要,允许替换

Posted

技术标签:

【中文标题】从数字集 N 生成长度 k 的组合,顺序很重要,允许替换【英文标题】:Generate combinations of length k from number set N, order matters, replacement allowed 【发布时间】:2017-03-06 13:30:23 【问题描述】:

我想从一组 N 个数字中生成长度为 k 的组合,其中顺序很重要,数字可以替换。例如,如果 k = 3,并且 N = [1, 2, 3],则候选输出将包括 (1, 1, 1), (2, 2, 2), (3, 2, 1) , (1, 2, 3)。

下面的代码我相信我快到了

x = list(itertools.combinations_with_replacement(range(1,4),3)

但这给出了顺序无关紧要的结果 - 即它认为 (1, 2, 3) 与 (3, 2, 1), (2, 3, 1) 等相同。

非常感谢任何帮助!

【问题讨论】:

你在乎有两倍的输出吗?你需要它是随机的吗? 排列不重复元素。 听起来你想要笛卡尔积。 【参考方案1】:

你需要的是product

import itertools

N = [1, 2, 3]

y = list(itertools.product(N, N))
print(y)  # [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
          #             ^               ^
          #             |_______________| he no longer thinks it's the same

现在,从你的问题来看,如果k != len(N) 不清楚你想做什么,所以我会把它留给你(切片N 可能吗?)..

【讨论】:

【参考方案2】:

试试这个:

import itertools
x = [1, 2, 3]
list(itertools.product(x, repeat=3))

【讨论】:

只是把它放在一个列表中。使用 list(itertools.product(x, repeat=3)) 可能会更好,现在编辑它 在最新版本的 Python 中,您可以使用 [*itertools.product(x, repeat=3)]

以上是关于从数字集 N 生成长度 k 的组合,顺序很重要,允许替换的主要内容,如果未能解决你的问题,请参考以下文章

从 n 个元素生成长度为 r 的组合而不重复或排列的函数的时间复杂度是多少?

正整数 uniq 的组合(顺序不重要)

从给定的数字中查找下一个最高的唯一数字

深搜优化剪枝

js生成随机码(只含有数字和字母的随机码)

生成 0, 1,...n-1, n 个 k 数的所有可能组合。每个组合应按升序排列[重复]