我想写一些东西来显示所有可能组合的有序列表。它可以从类似
的地方开始11-氨基酸 11-AB 11-交流
...最终结束于...
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、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。如果您以 11 开头(假设您希望数字按顺序排列),则无法以 59 结尾。
我最初离开了 - 并用 format 连接了每个字符串,但我认为这样比较慢。在我手头的每个 Python 版本上,它的速度也至少是原来的两倍。 (在 C 中,长度为 1 的循环的成本是微不足道的,构建 5 元组与构建 4 元组也是如此;format 与 join 的成本是不是。)
您还可以product range(11, 60) 和 product('ABCD', repeat=2),然后用 chain 将其展平,然后对每个进行 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
