目前我正在将一组变量保存到文本文件中。我正在检查我的代码是否有效,但每当我使用两位数字(如10)时,它都不会将此数字作为最大数字打印出来。
如果我的文本文件看起来像这样。
tom:5
tom:10
tom:1
它将输出5作为最大数字。
name = input('name')
score = 4
if name == 'tom':
fo= open('tom.txt','a')
fo.write('Tom: ')
fo.write(str(score ))
fo.write("\n")
fo.close()
if name == 'wood':
fo= open('wood.txt','a')
fo.write('Wood: ')
fo.write(str(score ))
fo.write("\n")
fo.close()
tomL2 = []
woodL2 = []
fo = open('tom.txt','r')
tomL = fo.readlines()
tomLi = tomL2 + tomL
fo.close
tomLL=max(tomLi)
print(tomLL)
fo = open('wood.txt','r')
woodL = fo.readlines()
woodLi = woodL2 + woodL
fo.close
woodLL=max(woodLi)
print(woodLL)
答案 0 :(得分:1)
您正在比较字符串,而不是数字。在使用max
之前,您需要将它们转换为数字。例如,您有:
tomL = fo.readlines()
这包含一个字符串列表:
['tom:5\n', 'tom:10\n', 'tom:1\n']
字符串被排序lexicographically(非常类似于在英语词典中排序的单词)。如果要比较数字,则需要先将它们转换为数字:
tomL_scores = [int(s.split(':')[1]) for s in tomL]
解析按以下方式完成:
….split(':')
使用冒号作为分隔符将字符串分成几部分:
'tom:5\n'
变为['tom', '5\n']
…[1]
从列表中选择第二个元素:
['tom', '5\n']
变为'5\n'
int(…)
将字符串转换为整数:
'5\n'
变为5
列表推导[… for s in tomL]
将此操作序列应用于列表的每个元素。
请注意int
(或类似float
)对它所接受的内容相当挑剔:它必须采用有效数字文字的形式,否则会被错误拒绝(尽管在允许尾随空格)。这就是为什么你需要….split(':')[1]
将字符串按到一个它愿意接受的形式。
这将产生:
[5, 10, 1]
现在,您可以应用max
来获得最高分。
作为附注,声明
fo.close
将不关闭文件,因为它实际上调用该函数。要调用该函数,必须将参数括在括号中,即使没有参数:
fo.close()