Python 列表上所有可能的数字组合
我需要找到定义长度的列表和定义大小的数字的所有可能组合,但受限于不允许列表中有相同重复数字的限制(0除外)。 目前,我有一个递归代码生成所有的组合,但当试图创建约束时,我失去了许多选项。 我已经尝试了一些选项来解决这个问题,但它仍然不适合我。提前感谢您的帮助Python 列表上所有可能的数字组合,python,Python,我需要找到定义长度的列表和定义大小的数字的所有可能组合,但受限于不允许列表中有相同重复数字的限制(0除外)。 目前,我有一个递归代码生成所有的组合,但当试图创建约束时,我失去了许多选项。 我已经尝试了一些选项来解决这个问题,但它仍然不适合我。提前感谢您的帮助 size=3 l=[0 for x in range(size)] def recursive(l, index, num, final): if index == len(l) or num == final:
size=3
l=[0 for x in range(size)]
def recursive(l, index, num, final):
if index == len(l) or num == final:
return
# if num!=0 and num in l:
# return
l[index]=num
print(l)
recursive(l, index+1, 0, final)
recursive(l, index, num+1, final)
recursive(l, 0, 0, 4)
大小为3且最终编号为3的列表的预期输出如下所示
[0, 0, 0]
[0, 0, 1]
[0, 0, 2]
[0, 0, 3]
[0, 1, 0]
[0, 1, 2]
[0, 1, 3]
[0, 2, 0]
[0, 2, 1]
[0, 2, 3]
[0, 3, 0]
[0, 3, 1]
[0, 3, 2]
[1, 0, 0]
[1, 0, 2]
[1, 0, 3]
[1, 2, 0]
[1, 2, 3]
[1, 3, 0]
[1, 3, 2]
[2, 0, 0]
[2, 0, 1]
[2, 0, 3]
[2, 1, 0]
[2, 1, 3]
[2, 3, 0]
[2, 3, 1]
[3, 0, 0]
[3, 0, 1]
[3, 0, 2]
[3, 1, 0]
[3, 1, 2]
[3, 2, 0]
[3, 2, 1]
从非零值的功率集开始(可在
itertools
文档中找到用于计算列表功率集的函数。)
(您可以计算包含0的幂集,但仍然需要对较短的元素进行零填充,并丢弃(0,1,2,3)
)
接下来,应使用零填充动力集的每个元素,以便它们都具有相同的长度
最后,您需要原始输入的每个0填充置换的置换列表(使用
itertools.permutations
)。从非零值的幂集开始(计算列表幂集的函数可在itertools
文档中找到)
(您可以计算包含0的幂集,但仍然需要对较短的元素进行零填充,并丢弃(0,1,2,3)
)
接下来,应使用零填充动力集的每个元素,以便它们都具有相同的长度
最后,您需要原始输入的每个0填充置换的置换列表(使用
itertools.permutations
)。使用itertools.compositions\u with_replacement()
,然后过滤掉重复的元素
def has_duplicates(l):
'''Return True if list has duplicate elements other than 0'''
l = [x in l if x != 0]
return len(l) != len(set(l))
result = [comb for comb in itertools.combinations_with_replacement(l, 3) if not has_duplicates(comb)]
您可以使用itertools.filterfalse()
使其变为惰性;这样,您就不会用一个大列表的所有组合来填充内存
result = itertools.filterfalse(has_duplicates, itertools.combinations_with_replacement(l, 3))
使用
itertools.compositions\u和\u replacement()
,然后过滤掉重复的元素
def has_duplicates(l):
'''Return True if list has duplicate elements other than 0'''
l = [x in l if x != 0]
return len(l) != len(set(l))
result = [comb for comb in itertools.combinations_with_replacement(l, 3) if not has_duplicates(comb)]
您可以使用itertools.filterfalse()
使其变为惰性;这样,您就不会用一个大列表的所有组合来填充内存
result = itertools.filterfalse(has_duplicates, itertools.combinations_with_replacement(l, 3))
这是一个基于计数器的解决方案,我使用的是base 4计数器:
def charcnt(s,a):
ctr=[1如果x==a,则s中的x为0]
回报总额(ctr)
def my_范围(开始、结束、基本、步骤=1):
def转换(n,基本):
string=“0123”
如果n 1或charcnt(s,'2')>1或charcnt(s,'3')>1:
持续
其他:
结果。追加
结果=[[int(n)表示列表中的n]s表示结果中的s]
#打印(len(结果))
就我而言,结果是:
印刷品(一)
将产生:
[0,0,0]
[0, 0, 1]
[0, 0, 2]
[0, 0, 3]
[0, 1, 0]
[0, 1, 2]
[0, 1, 3]
[0, 2, 0]
[0, 2, 1]
[0, 2, 3]
[0, 3, 0]
[0, 3, 1]
[0, 3, 2]
[1, 0, 0]
[1, 0, 2]
[1, 0, 3]
[1, 2, 0]
[1, 2, 3]
[1, 3, 0]
[1, 3, 2]
[2, 0, 0]
[2, 0, 1]
[2, 0, 3]
[2, 1, 0]
[2, 1, 3]
[2, 3, 0]
[2, 3, 1]
[3, 0, 0]
[3, 0, 1]
[3, 0, 2]
[3, 1, 0]
[3, 1, 2]
[3, 2, 0]
[3, 2, 1]
这是一个基于计数器的解决方案,我使用的是基本4计数器:
def charcnt(s,a):
ctr=[1如果x==a,则s中的x为0]
回报总额(ctr)
def my_范围(开始、结束、基本、步骤=1):
def转换(n,基本):
string=“0123”
如果n 1或charcnt(s,'2')>1或charcnt(s,'3')>1:
持续
其他:
结果。追加
结果=[[int(n)表示列表中的n]s表示结果中的s]
#打印(len(结果))
就我而言,结果是:
印刷品(一)
将产生:
[0,0,0]
[0, 0, 1]
[0, 0, 2]
[0, 0, 3]
[0, 1, 0]
[0, 1, 2]
[0, 1, 3]
[0, 2, 0]
[0, 2, 1]
[0, 2, 3]
[0, 3, 0]
[0, 3, 1]
[0, 3, 2]
[1, 0, 0]
[1, 0, 2]
[1, 0, 3]
[1, 2, 0]
[1, 2, 3]
[1, 3, 0]
[1, 3, 2]
[2, 0, 0]
[2, 0, 1]
[2, 0, 3]
[2, 1, 0]
[2, 1, 3]
[2, 3, 0]
[2, 3, 1]
[3, 0, 0]
[3, 0, 1]
[3, 0, 2]
[3, 1, 0]
[3, 1, 2]
[3, 2, 0]
[3, 2, 1]
尝试,但是ItRealToT不考虑顺序[1,2,3]=[3,2,1],但在我的情况下,这不是一个有用的技巧,而是要考虑的是,您可以使用“<代码> k < /COD>元素>list@GuillermoMeza:itertools
是整个模块;其中一些是顺序不敏感的(组合
,带替换的组合
),一些不是(置换
,产品
)。整个<代码>迭代器模块充满了令人惊讶的有用的实用程序,如果你认为“它不考虑订单”,你就不会仔细查看。我试过了,但是TyrToice不考虑顺序[1,2,3]=[3,2,1],但在我的情况下,这不是一个有用的技巧,而是要考虑的是,您可以使用“<代码> k < /COD>元素>list@GuillermoMeza:itertools
是整个模块;其中一些是顺序不敏感的(组合
,带替换的组合
),一些不是(置换
,产品
)。整个<代码>迭代器模块充满了令人惊讶的有用的实用程序,如果你认为“它不考虑订单”,你就看得不够仔细。你如何得到所有不同的PADD?