Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 其中';生成有序非重复组合列表的for循环中的错误是什么?_Python_Loops - Fatal编程技术网

Python 其中';生成有序非重复组合列表的for循环中的错误是什么?

Python 其中';生成有序非重复组合列表的for循环中的错误是什么?,python,loops,Python,Loops,给定一个整数变量n,比如3,我想得到以下组合: [1,2,3,12,13,23,123]并将它们保存在列表中。 这是我写的: cmb = [] for i in xrange(1,n+1): for j in xrange(i,n+1): cmb.extend(list(itertools.combinations(xrange(i,n+1),j))) 但是当我打印时,我会得到一些不需要的重复元组: n=3:[(1,),(2,),(3,),(1,2),(1,3),(2,

给定一个整数变量n,比如3,我想得到以下组合: [1,2,3,12,13,23,123]并将它们保存在列表中。 这是我写的:

cmb = []
for i in xrange(1,n+1):
    for j in xrange(i,n+1):
        cmb.extend(list(itertools.combinations(xrange(i,n+1),j)))
但是当我打印时,我会得到一些不需要的重复元组:

n=3:[(1,),(2,),(3,),(1,2),(1,3),(2,3),(1,2,3),(2,3)]

n=4:[(1,),(2,),(3,),(4,),(1,2),(1,3),(1,4),(2,4),(1,2,3),(1,2,4),(1,3,4),(2,3,4),,(2,3),(2,4),(3,4),]

n=5:


我做错了什么?

代码的问题是您不断更改输入范围。例如,您从
[1,2,3]
中获取了2个元素,但也从
[2,3]
中获取了2个元素。您应该从相同的范围中选择组合,只需更改每次获得的元素数。为此,您不需要双循环:

import itertools
cmb = []
for i in xrange(1, n + 1):
    cmb.extend(itertools.combinations(xrange(1, n + 1), i))
您还可以实现与以下相同的功能:

from itertools import chain, combinations
n = 3
print list(chain.from_iterable(
    combinations(xrange(1, n + 1), i) for i in xrange(1, n + 1)
))
输出:

[(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]

JuniorCompressor已经回答了您的问题,但下面是一个列表理解解决方案,它使用位掩码从原始集合中筛选元素,以便生成powerset的唯一元素:

>>> sorted([tuple(x for i, x in enumerate([1, 2, 3]) if y & 2**i) 
...         for y in range(1, 8)], key=len)
[(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]

简单的方法是将它们转换为
set
s。双循环背后的逻辑是什么?很好的解释。但你可能不应该在不提及的情况下,将他的xrange更改为range。并不是说构建n个小范围很可能会对性能产生影响,所以这不是一个坏的变化,只是一个没有解释的不必要的变化。