2009-09-17 87 views
0

任務是生成給定長度的給定數量的數字引腳。 這是我想出了的數字管腳的特定情況下,代碼不以0開頭:唯一引腳生成器

def generate_pins(length, count): 
    return random.sample(range(int('1' + '0' * (length - 1)), int('9' * length)), count) 

你將如何實現呢?

編輯:引腳不應該重複。

編輯2:可能讓我們擴展此示例,以便引腳可以包含任何字母數字符號。

+0

正在做作業嗎? – SingleNegationElimination 2009-09-17 03:21:13

+0

沒有。家庭作業我太老了。 :) 學習Python並尋找合適的方式來做事情。 – yanchenko 2009-09-17 03:26:24

+0

引腳可以以'0'開頭嗎? – 2009-09-17 03:29:19

回答

6

random.sample保證不重複(「無取代無取樣」,根據the docs);這是你的規格的一部分嗎?

所表達的(不加任何詞「不同」表示缺乏重複的),我會做:

import random 
import string 

def generate_pins(length, count): 
    return [''.join(random.choice(string.digits) for x in xrange(length)) 
      for x in xrange(count)] 

隨着一個附加條件,即所有的引腳返回是唯一的:

def generate_pins(length, count, alphabet=string.digits): 
    alphabet = ''.join(set(alphabet)) 
    if count > len(alphabet)**length: 
    raise ValueError("Can't generate more than %s > %s pins of length %d out of %r" % 
         count, len(alphabet)**length, length, alphabet) 
    def onepin(length): 
    return ''.join(random.choice(alphabet) for x in xrange(length)) 
    result = set(onepin(length) for x in xrange(count)) 
    while len(result) < count: 
    result.add(onepin(length)) 
    return list(result) 

假設規格要求您返回一個列表。

編輯:鑑於OP的後期澄清和規範的變化,第二個答案看起來不錯,除了string.ascii_lowercase + string.digits(或一些變體,例如,如果小寫和大寫ASCII字母都需要)應在onepin使用。您應該更準確地指定您想要繪製字符的「字母」字符串(可能將其作爲參數傳遞給generate_pinsNone表示generate_pins應選擇默認字母表,例如string.digits)。

進一步編輯:增加了可選的字母參數,並檢查可以生成給定長度和字母表的不同引腳的數量。

+0

從大師學習! set()的大用途,我一直在忘記它們。一個關於頂部例子的警告詞:OP的引腳是這樣的,它們沒有零作爲第一位;這是由設計或只是一種方便...此外,亞歷克斯的解決方案是不受限制的針腳長度,不像原來的剪切,由於範圍()需要int(?) – mjv 2009-09-17 03:36:15

+0

猜測不應該期待更多的答案。 :) – yanchenko 2009-09-17 03:44:43

+0

@mjv,tx爲發現,編輯修復。 (實際上,最近有一些Javascript,雖然大部分是Python--不過一段時間沒有C++或Java--但這只是一個真正的錯字;-)。 – 2009-09-17 04:09:27

1

由於OP沒有說隨機PIN,唯一的標準似乎是唯一的PIN 這裏是最快的方法

def generate_pins(length, count): 
    start=10**length 
    return range(start,start+count,1) 

你也不能總是保證uniqeness,相同的長度,並在同一時間 例如數嘗試generate_pins(1,11)爲亞歷克斯的答案。