Python 其中';生成有序非重复组合列表的for循环中的错误是什么?
给定一个整数变量n,比如3,我想得到以下组合: [1,2,3,12,13,23,123]并将它们保存在列表中。 这是我写的: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,
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个小范围很可能会对性能产生影响,所以这不是一个坏的变化,只是一个没有解释的不必要的变化。