我正在尝试创建一个生成器(支持执行next的迭代器,可能在python中使用yield),它给出来自{1,2,...n}的r元素的所有组合(n和r是参数),这样在选定的r个元素,没有两个是连续的。例如,对于r=2和n=4生成的组合是{1,3},{1,4},{2,4}.我可以生成所有组合(作为迭代器)并过滤那些不满足条件的组合,但我们将做不必要的工作。是否有一些生成算法使得next是O(1)(如果不可能,则为O(r)或O(n))。返回集合的顺序不相关(并且希望允许O(1)算法)。注意:我已将其标记为python,但与语言无关的算法也会有所帮助。更新:我找到了一种将其映射到生成纯组合的方法
我有一个值列表,例如:values=[1,2,3,4]我想尝试此列表中的所有组合,例如:1+21+31+41*21*31*41+2*31+2*41+3*4等等以最简洁的方式获得所有这些可能的操作组合的最直接方法是什么?我会想象有两个列表,[1,2,3,4]和[+,*,-,/]然后采用所有长度的数字的所有组合,然后用所有组合填充空白.所以选择[1,2,3]然后选择操作的所有排列并将它们组合在一起。这看起来很乱,我希望有更清晰的编码方式? 最佳答案 这是一个递归解决方案,它从数字和运算符构建表达式,然后使用eval计算它:vals=[1
fromitertoolsimportproductteams=['india','australia','newzealand']word_and=['and']tmp='%s%s%s'items=[teams,word_and,teams]print(list(tmp%aforainlist(product(*items))))打印:['indiaandindia','indiaandaustralia','indiaandnewzealand','australiaandindia','australiaandaustralia','australiaandnewzealand'
如何在Python中唯一化以下列表:all_the_ways=[(5,),(2,2,1),(2,1,2),(2,1,1,1),(1,2,2),\(1,2,1,1),(1,1,2,1),(1,1,1,2),(1,1,1,1,1)]期望的输出是:[(5,),(2,2,1),(2,1,1,1),(1,1,1,1,1)]即我需要摆脱具有相同数字集但顺序不同的元组。我试过了set(all_the_ways)但它只是转置元素。当我这样做的时候list(map(set,all_the_ways))事情只会变得更糟:[{5},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1
我正在使用Python2.7。我有一个列表,我想要所有可能的有序组合。importitertoolsstuff=["a","b","c","d"]forLinrange(1,len(stuff)+1):forsubsetinitertools.combinations(stuff,L):print(''.join(subset))这将给出以下输出:abcdabac但我只希望输出是与stuff列表顺序相同的组合。例如。删除ad、bd、abd和acd因为与相比,它们的顺序不正确列表["a","b","c","d"]。我想出了用这个代替:importitertoolsstuff=["a","
有几个在Python中使用numpy生成所有组合数组的优雅示例。例如这里的答案:Usingnumpytobuildanarrayofallcombinationsoftwoarrays.现在假设有一个额外的约束,即所有数字的总和不能超过给定常数K。使用生成器和itertools.product,以K=3为例,我们想要三个变量的组合,范围为0-1、0-3和0-2我们可以这样做:fromitertoolsimportproductK=3maxRange=np.array([1,3,2])states=np.array([iforiinproduct(*(range(i+1)foriinma
我想知道是否有任何方法可以从数字列表中获取长度n的所有组合。例如,如果我的列表是[1,2,3,4],我想输出(如果我选择n=3)[1,2,3][1,2,4][1,3,4][2,3,4]其他排列如[2,1,3]对我没有用。 最佳答案 itertools可以这样做:importitertoolsforcombinitertools.combinations([1,2,3,4],3):print(comb)输出:(1,2,3)(1,2,4)(1,3,4)(2,3,4) 关于python-如何在
我有一个数字列表,例如numbers=[1,2,3,7,7,9,10]如您所见,数字可能在此列表中出现多次。我需要得到这些具有给定总和的数字的所有组合,例如10。组合中的项目可能不会重复,但是numbers中的每个项目都必须被唯一地对待,这意味着例如列表中的两个7代表具有相同值的不同项目。顺序不重要,因此[1,9]和[9,1]是相同的组合。组合没有长度限制,[10]与[1,2,7]一样有效。如何创建满足上述条件的所有组合的列表?在这个例子中,它将是[[1,2,7],[1,2,7],[1,9],[3,7],[3,7],[10]] 最佳答案
我有以下python程序:#!/usr/bin/envpythonimportargparseparser=argparse.ArgumentParser()parser.add_argument('arg',choices=['foo','bar','baz'],default='foo',nargs='*')args=parser.parse_args()print(args)如果我这样调用程序:./prog.py输出是Namespace(arg='foo')但是如果我用foo作为参数调用程序:./prog.pyfoo输出是Namespace(arg=['foo'])问题如何让ar
给定一个三元组列表,例如:[(1,2,3),(4,5,6),(7,8,9)]你将如何计算所有可能的组合和子集的组合?在这种情况下,结果应如下所示:[(1),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(1,4,7),(1,4,8),(1,4,9),(1,5,7),(1,5,8),(1,5,9),(1,6,7),(1,6,8),(1,6,9),(2),...,(3),...,(4),(4,7),(4,8),(4,9),(5),(5,7),(5,8),(5,9),(6),(6,7),(6,8),(6,9),(7),(8),(9)]所有具有相同元素的元组都被认为是