将随机生成的字符串与现有字符串列表进行比较

时间:2019-04-03 06:59:51

标签: python recursion

我有一个需要唯一5个字符ID的表格。我有一个生成该唯一ID的函数。在将其输入表单之前,我想将其与现有ID列表进行比较。如果生成的ID在列表中不存在,则将其传递给变量;否则,将其传递给变量。如果它确实存在并且不是唯一的,则生成另一个ID。最好的方法是什么?

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()

4 个答案:

答案 0 :(得分:1)

while True:
    a = generate_id()
    if a not in set(existing_ids) : 
        break

答案 1 :(得分:0)

调试

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(),谁知道它可能是 dupe

因此

如果要一直生成唯一ID,直到显示现有列表中不存在的唯一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

答案 2 :(得分:0)

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)

答案 3 :(得分:0)

我认为您可以尝试位图?由于5个字符可以构造一个<{2**32的数字,因此您可以生成一个随机数[0-26**6]并将其用于mod 26以获取仅5个字符, 您可以使用位图检查其是否存在。