最大数量组合

时间:2009-09-06 15:30:46

标签: python combinations

我正在尝试使用0到9之间的所有数字生成一组四个数字中所有可能数字组合的列表。

我越来越接近,但输出并没有显示从0000一直到9999的所有可能组合。

以下代码为什么会删除某些组合的任何线索?

def permgen(items, n):
  if n==0: yield []
    else:
        for i in range(len(items)):
            for cc in permgen(items[:i]+items[i+1:],n-1):
                yield [items[i]]+cc

if __name__=="__main__":
    for c in permgen(['0','1','2','3','4','5','6','7','8','9'],4): print ''.join(c)

4 个答案:

答案 0 :(得分:12)

如果你有python 2.6,为什么不使用itertools.combinations

from itertools import combinations
combinations(range(10), 4)

答案 1 :(得分:4)

这一行:

for cc in permgen(items[:i]+items[i+1:],n-1):

你基本上是说“得到一个数字,而不是从ir中添加另一个不同的,重复n次,然后返回这些数字的列表。这将给你数字,其中没有数字出现不止一次。如果您将该行更改为:

for cc in permgen(items,n-1):

然后你得到所有组合。

答案 2 :(得分:4)

看看itertools' combinatoric generators

>>> from itertools import combinations, permutations, product
>>> def pp(chunks):
...     print(' '.join(map(''.join, chunks)))
...
>>> pp(combinations('012', 2))
01 02 12
>>> pp(permutations('012', 2))
01 02 10 12 20 21
>>> pp(product('012', repeat=2))
00 01 02 10 11 12 20 21 22
>>> from itertools import combinations_with_replacement
>>> pp(combinations_with_replacement('012', 2))
00 01 02 11 12 22

combinations_with_replacement在Python 3.1(或2.7)中可用。

似乎itertools.product最适合您的任务。

答案 3 :(得分:0)

int ra;
for(ra=0,ra<10000;ra++) printf("%04u\n",ra);