我期待写一些能显示所有可能组合的有序列表的东西.它可以从类似的东西开始
11-AA 11-AB 11-AC
......并最终以......结束
59-YZ 59-ZZ
如果数字的第一部分只能在1-5之间,我也会喜欢它.我一直在使用itertools,但我很难生成这种特定的东西.我可以生成重复两次的4个字母的所有可能组合,但是我遇到问题,并告诉程序"嘿,你只能选择1到4之间的第一个数字".
import itertools
perms = itertools.product('ABCD', repeat=2)
for perm in perms:
print('The possible combinations are', perm)
Run Code Online (Sandbox Code Playgroud)
有代码.这不是必须使用itertools,这正是我熟悉的.
编辑:第一个答案正是我需要的.因为逗号,我不喜欢itertools正在做的事情,但你给我看的小片段是魔术.谢谢.
要回答这个问题,循环似乎不太干净?我也刚刚发现了itertools,我可能太喜欢了.
只是以相同的方式做到这一点.一个字符必须是1,2,3,4,或5; 第二个可以是任何数字; 第三必须是-,最后两个必须是A,B,C,或D,所以:
perms = itertools.product('12345', '0123456789', '-', 'ABCD', 'ABCD')
Run Code Online (Sandbox Code Playgroud)
然后,将它们加入到字符串中:
print('The possible combinations are:')
for perm in perms:
print(''.join(perm))
Run Code Online (Sandbox Code Playgroud)
这开始于10-AA,而不是11-AA.59如果你开始就没有办法结束11(假设你想要按顺序排列数字).
我最初离开了-外面并加入了每个字符串format,但我认为这个速度较慢.在我使用的每个Python版本上,它的速度至少要快两倍.(在C 1长度的套环的成本是微不足道的,因为是建立一个5元组对4元组;的成本format与join不).
你也可以product用a range(11, 60)和a product('ABCD', repeat=2),然后将它压扁chain,然后format每一个.虽然这是概念上比较简单,这将是一个很多难以阅读,并即将为扁平慢format版本.
无论如何,在OS X 10.9上的64位python.org 3.3.2中:
In [1189]: %timeit collections.deque((''.join(perm) for perm in itertools.product('1234', '1234567890', '-', 'ABCD', 'ABCD')), maxlen=0)
10000 loops, best of 3: 129 µs per loop
In [1190]: %timeit collections.deque(('{}{}-{}{}'.format(*perm) for perm in itertools.product('1234', '1234567890', 'ABCD', 'ABCD')), maxlen=0)
1000 loops, best of 3: 359 µs per loop
Run Code Online (Sandbox Code Playgroud)