Python中if条件判断失效问题:生成数据库唯一编号遇阻
问题原因及解决方案
核心问题1:条件判断逻辑完全错误
你写的if numer not in BCheck or bramy:逻辑和需求完全不匹配:
- 初始时
bramy是空列表,布尔判断里空列表等价于False,此时条件简化成numer not in BCheck,根本没检查这个编号会不会和新生成的列表重复; - 一旦
bramy有内容,or bramy等价于True,不管生成的编号是不是在已有数据库里,都会直接加入列表,必然导致重复。
正确的逻辑应该是同时检查编号不在已有数据库和新列表中,用and而非or:
if numer not in BCheck and numer not in bramy:
核心问题2:数据库返回的BCheck可能不是纯整数列表
哪怕你认为BCheck是整数列表,多数数据库查询接口返回的是元组组成的列表(比如每行数据是一个包含单列值的元组,格式像[(1,), (3,), (5,)]),而非纯整数列表[1,3,5]。这种情况下,numer not in BCheck永远为True(因为整数不会出现在元组列表里),直接导致条件失效,重复编号被加入。
你可以先打印BCheck的实际结构确认:
print(BCheck) print(type(BCheck[0])) # 查看单个元素的类型
如果确实是元组列表,需要先转换成纯整数列表:
conn.execute('SELECT numer FROM Brama') BCheck = [row[0] for row in conn.getData()]
修正后的完整代码
import random # 获取数据库已有编号并转换为纯整数列表 conn.execute('SELECT numer FROM Brama') BCheck = [row[0] for row in conn.getData()] bramy = [] while True: numer = random.randint(1,15) # 检查编号既不在数据库,也不在新生成的列表中 if numer not in BCheck and numer not in bramy: bramy.append(numer) print(BCheck) print(bramy) break
内容的提问来源于stack exchange,提问作者Daniel Jeleń Morzejko
相关产品推荐
相关产品推荐

