Сравнить случайно сгенерированную строку с существующим списком строк

#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, чтобы проверить, существует ли оно.