#python #recursion
#python #рекурсия
Вопрос:
У меня есть форма, которая ожидает уникальный идентификатор из 5 символов. У меня есть функция, которая генерирует этот уникальный идентификатор. Прежде чем вводить ее в форму, я хочу сравнить ее с существующим списком идентификаторов. Если сгенерированный идентификатор не существует в списке, передайте его в переменную; если он существует и не уникален, сгенерируйте другой идентификатор. Каков наилучший способ сделать это?
def generate_id():
random_id= ''.join(random.choice(string.ascii_uppercase string.digits) for _ in range(5))
return random_id
existing_ids = ['AAAAA', 'BBBBB', 'CCCCC']
for id in existing_ids:
if not generate_id() == id:
unique_id = generate_id()
Комментарии:
1. У меня работает нормально, где ты застрял?
2. ЗА исключением одной вещи.
Ответ №1:
while True:
a = generate_id()
if a not in set(existing_ids) :
break
Комментарии:
1. Используйте
while True
вместоwhile 1
. Это понятнее. Также:existing_ids
должно бытьset
иначе это займет вечность.
Ответ №2:
Отладка:
for id in existing_ids:
Это обозначает выполнение цикла для количества элементов в existing_ids
, что определенно не то, что вы хотите.
if not generate_project_id() == id:
unique_id = generate_project_id()
Помимо неправильного имени метода, которое generate_project_id()
должно было быть generate_id()
, это не приведет к тому, что вы думаете, т. Е. Даже если id
оно уникально, оно сохранит другое id
в unique_id
, поскольку оно снова вызывает метод, unique_id = generate_project_id()
и кто знает, может быть, это обман!
Следовательно:
Если предполагается продолжать генерировать уникальные идентификаторы до тех пор, пока не появится тот, которого нет в существующем списке, поместите его в цикл, используя set()
для исключения любых дубликатов в существующем списке:
import string
def generate_id():
random_id = ''.join(random.choice(string.ascii_uppercase string.digits) for _ in range(5))
return random_id
existing_ids = ['AAAAA', 'BBBBB', 'CCCCC']
while True:
genId = generate_id()
if genId not in set(existing_ids):
unique_id = genId
break
Ответ №3:
import random
import string
def generate_id():
random_id = ''
random_id = ''.join(random.choice
(string.ascii_uppercase string.digits) for _ in range(5))
return random_id
existing_ids = ['AAAAA', 'BBBBB', 'CCCCC']
unique_id = generate_id()
while unique_id in existing_ids:
unique_id = generate_id()
if unique_id not in existing_ids:
break;
print(unique_id)
Ответ №4:
Я думаю, вы могли бы попробовать bitmap? Поскольку 5 символов могут создать число, которое < 2**32
, поэтому вы можете сгенерировать случайное число [0- 26**6
] и использовать его для изменения 26, чтобы получить только 5 символов, вы можете использовать bitmap, чтобы проверить, существует ли оно.