2009-09-17 88 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)为亚历克斯的答案。