簡體   English   中英

Python訂購數字組合?

[英]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,並且可能非常喜歡它。

做到相等。 一個字符必須是1234 ,或5 ; 第二個可以是任何數字; 第三個必須是- ,最后兩個必須是ABCD ,所以:

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個元組的開銷是微不足道的;而formatjoin的開銷則不是。)

您也可以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM