【问题标题】:Why is max number ignoring two-digit numbers?为什么最大数字忽略两位数?
【发布时间】:2015-02-22 10:19:59
【问题描述】:

目前我正在将一组变量保存到一个文本文件中。我正在执行以下操作以检查我的代码是否有效,但是每当我使用两位数(例如 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)

【问题讨论】:

  • 您在比较字符串,而不是数字。在使用max之前,您需要将它们转换为floats。
  • 好吧,像这样:keys.sort(key=float)
  • 没那么简单。就 Python 而言,字符串只是一个无定形的字符序列:它不知道里面是否有人类可读的数字。为了提取该数字,您需要明确地parse 字符串。
  • 非常感谢您辛苦了

标签: list file python-3.x max


【解决方案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] 从列表中选择 second 元素:

    ['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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多