我正在寻找能够显示所有可能组合的有序列表的内容。它可以从
开始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)
有代码。这不是必须使用itertools,这正是我熟悉的。
编辑:第一个答案正是我所需要的。因为逗号,我不喜欢itertools正在做的事情,但你给我看的小片段是魔术。谢谢。要回答这个问题,循环似乎不太干净?我也刚刚发现了itertools,我可能太喜欢了。
答案 0 :(得分:7)
只是以相同的方式做到这一点。一个字符必须是1
,2
,3
,4
或5
;第二个可以是任何数字;第三个必须是-
,后两个必须是A
,B
,C
或D
,所以:
perms = itertools.product('12345', '0123456789', '-', 'ABCD', 'ABCD')
然后,将它们加入到字符串中:
print('The possible combinations are:')
for perm in perms:
print(''.join(perm))
这从10-AA
开始,而不是11-AA
。如果您从59
开始,则无法以11
结束(假设您希望按顺序排列数字)。
我最初离开了-
,并将每个字符串与format
结合在了一起,但我认为这个速度较慢。它在我使用的每个Python版本上的速度至少也是其两倍。 (C中1长度循环的成本是微不足道的,构建5元组与4元组相比; format
与join
的成本不同。)
您还可以product
提升range(11, 60)
和product('ABCD', repeat=2)
,然后将其展开为chain
,然后展开format
。虽然概念更简单,但它会更难以阅读 lot ,并且与平面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