Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将随机生成的字符串与现有字符串列表进行比较_Python_Recursion - Fatal编程技术网

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

Python 将随机生成的字符串与现有字符串列表进行比较,python,recursion,Python,Recursion,我有一个表单需要一个唯一的5个字符的ID。我有一个函数可以生成这个唯一的ID。在表单中输入它之前,我想将它与现有的ID列表进行比较。如果生成的ID在列表中不存在,则将其传入变量;如果它确实存在并且不是唯一的,请生成另一个ID。最好的方法是什么 def生成_id: random_id=.joinrandom.choicestring.ascii_大写+字符串.digits表示范围5中的u 返回随机id 现有_id=['AAAAA','BBBBB','CCCCC'] 对于现有_id中的id: 如果不

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

def生成_id: random_id=.joinrandom.choicestring.ascii_大写+字符串.digits表示范围5中的u 返回随机id 现有_id=['AAAAA','BBBBB','CCCCC'] 对于现有_id中的id: 如果不生成_id==id: 唯一\u id=生成\u id 调试:

这表示针对现有_id中的项数执行循环,这肯定不是您想要的

if not generate_project_id() == id:
    unique_id = generate_project_id()
除了不正确的方法名称外,generate_project_id应该是generate_id,这不会像您认为的那样,即即使id是唯一的,它也会在unique_id中存储一个不同的id,因为它再次调用该方法,unique_id=generate_project_id,谁知道它可能是一个重复

因此:

如果要一直生成唯一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

我想你可以试试吗?因为5个字符可以构造一个小于2**32的数字,所以您可以生成一个随机数[0-26**6],并将其用于mod 26,以获得仅有的5个字符,
您可以使用位图检查它是否存在。

对我来说很好,您卡在哪里了?除了一件事。使用while True而不是while 1。更清楚了。另外:现有的_id应该是一个集合,否则将花费很长时间。
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
while True:
    a = generate_id()
    if a not in set(existing_ids) : 
        break
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)