random.sample
гарантирует отсутствие повторения («выборка без замены», за документы ); это условие является частью вашей спецификации?
Если выразить (без слова " отчетливый " для обозначения отсутствия повторения), я бы сделал:
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)
при условии, что спецификации требуют, чтобы вы вернули список.
Редактировать : с учетом позднего разъяснения ОП и изменения спецификации второй ответ выглядит хорошо, за исключением string.ascii_lowercase + string.digits
(или некоторых его вариантов, например, если требуются как строчные, так и прописные буквы ASCII), которые должны использоваться в onepin
. Вы должны точно указать, из какой именно строки «алфавита» вы хотите рисовать символы (возможно, передайте ее generate_pins
в качестве аргумента, с None
, указывающим generate_pins
, следует выбрать алфавит по умолчанию, например, string.digits
).
Дальнейшее редактирование : добавлен необязательный аргумент алфавита и проверяется количество отдельных выводов, которые могут быть сгенерированы с учетом длины и этого алфавита.