[英]Python ordered combination of numbers?
我正在尋找可以顯示所有可能組合的有序列表的內容。 它可以開始於
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
, 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
每個。 雖然這是概念比較簡單,它要困難得多閱讀,大約是平慢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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.