Python 试图找到下一个最大值时出现算法错误
Python algorithm error when trying to find the next largest value
我编写了一个算法来扫描 "ID's" 的文件并将该值与整数 i 的值进行比较(我已将整数转换为字符串以进行比较,并且我已经从行中删除“\n”前缀)。该算法比较文件中每一行(每个 ID)的这些值。如果它们相等,则算法将 i 增加 1,并使用新的 i 值进行递归。如果值不相等,它将与文件中的下一行进行比较。它会这样做,直到它有一个不在文件中的 i 值,然后 returns 该值用作下一条记录的 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,然后想要 return 下一个可用值:
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
不过,我们可以用更Python化的方式来解决:
def _getAvailableID(IDFileName):
with open(IDFileName,"r") as f:
mx_id = max(f, key=int)
return int(mx_id)+1
我编写了一个算法来扫描 "ID's" 的文件并将该值与整数 i 的值进行比较(我已将整数转换为字符串以进行比较,并且我已经从行中删除“\n”前缀)。该算法比较文件中每一行(每个 ID)的这些值。如果它们相等,则算法将 i 增加 1,并使用新的 i 值进行递归。如果值不相等,它将与文件中的下一行进行比较。它会这样做,直到它有一个不在文件中的 i 值,然后 returns 该值用作下一条记录的 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,然后想要 return 下一个可用值:
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
不过,我们可以用更Python化的方式来解决:
def _getAvailableID(IDFileName):
with open(IDFileName,"r") as f:
mx_id = max(f, key=int)
return int(mx_id)+1