我写了一个算法,扫描了一个" ID"并将该值与整数i的值进行比较(我将整数转换为字符串进行比较,并且我已从该行修剪了" \ n"前缀)。该算法比较文件中每一行的这些值(每个ID)。如果它们相等,则算法将i增加1并使用i的新值进行reccurtion。如果值不相等,则将其与文件中的下一行进行比较。它执行此操作,直到它具有i的值,该值不在文件中,然后返回该值以用作下一条记录的ID。
我的问题是我有一个ID的文件列出了1,3,2,因为我删除了ID为2的记录,然后创建了一条新记录。这表明算法正常工作,因为它为新记录提供了之前删除的ID 2。但是,当我创建新记录时,下一个ID为3,导致我的ID列表显示为:1,3,2,3
而不是1,3,2,4
。贝娄是我的算法,带有print()
命令的结果。我可以看到它出错的地方,但无法解决原因。有什么想法吗?
算法:
def _getAvailableID(iD):
i = iD
f = open(IDFileName,"r")
lines = f.readlines()
for line in lines:
print("%s,%s,%s"%("i=" + str(i), "ID=" + line[:-1], (str(i) == line[:-1])))
if str(i) == line[:-1]:
i += 1
f.close()
_getAvailableID(i)
return str(i)
输出: (运行算法以查找ID应为4的记录的适当ID时的输出):
i=1,ID=1,True
i=2,ID=1,False
i=2,ID=3,False
i=2,ID=2,True
i=3,ID=1,False
i=3,ID=3,True
i=4,ID=1,False
i=4,ID=3,False
i=4,ID=2,False
i=4,ID=2,False
i=2,ID=3,False
i=2,ID=2,True
i=3,ID=1,False
i=3,ID=3,True
i=4,ID=1,False
i=4,ID=3,False
i=4,ID=2,False
i=4,ID=2,False
答案 0 :(得分:6)
我认为你的程序失败了,因为你需要改变:
_getAvailableID(i)
到
return _getAvailableID(i)
(目前递归函数找到了丢弃的正确答案。)
然而,简单地将您看到的所有ID放入集合中可能会更好,以使程序更有效。
e.g。在伪代码中:
S = set()
loop over all items and S.add(int(line.rstrip()))
i = 0
while i in S:
i += 1
return i
答案 1 :(得分:1)
如果您只是在文件中查找最大ID,然后想要返回下一个可用值:
def _getAvailableID(IDFileName):
iD = '0'
with open(IDFileName,"r") as f:
for line in f:
print("ID=%s, line=%s" % (iD, line))
if line > iD:
iD = line
return str(int(iD)+1)
print(_getAvailableID("IDs.txt"))
包含
的输入文件1
3
2
输出
ID=1, line=1
ID=1
, line=3
ID=3
, line=2
4
但是,我们可以用更加pythonic的方式解决它:
def _getAvailableID(IDFileName):
with open(IDFileName,"r") as f:
mx_id = max(f, key=int)
return int(mx_id)+1