我正在尝试使用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)
答案 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);