Python命令组合数字?

时间:2013-12-02 22:05:53

标签: python

我正在寻找能够显示所有可能组合的有序列表的内容。它可以从

开始

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,我可能太喜欢了。

1 个答案:

答案 0 :(得分:7)

只是以相同的方式做到这一点。一个字符必须是12345;第二个可以是任何数字;第三个必须是-,后两个必须是ABCD,所以:

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元组相比; formatjoin的成本不同。)

您还可以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