尝试查找下一个最大值时出现 Python 算法错误



我编写了一个算法,可以扫描"ID"的文件并将该值与整数 i 的值进行比较(我已将整数转换为字符串进行比较,并且我从行中删除了""前缀)。该算法比较文件中每一行(每个 ID)的这些值。如果它们相等,则算法将 i 增加 1,并使用新值为 i 的递归。如果该值不等于,则会将其与文件中的下一行进行比较。它这样做,直到它有一个不在文件中的 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

我认为您的程序失败了,因为您需要更改:

_getAvailableID(i)

 return _getAvailableID(i)

(目前递归函数找到被丢弃的正确答案。

但是,最好简单地将您看到的所有 id 放入一个集合中,以使程序更高效。

例如,在伪代码中:

S = set()
loop over all items and S.add(int(line.rstrip()))
i = 0
while i in S:
   i += 1
return i

如果您只是在文件中查找最大 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

相关内容

  • 没有找到相关文章

最新更新