【问题标题】:Highest to lowest从最高到最低
【发布时间】:2015-12-13 02:19:13
【问题描述】:

我的代码有问题,我试图找到一种方法来显示从最高到最低的分数。

但每次我这样做时都会出现一堆数字或者它表示对象。

我正在尝试从存储它的文本文件中获取分数。除了这部分之外,我的其余代码都很好。

我尝试了很多方法,以至于我不知道自己在做什么。

with open('class1.txt', 'r') as f:
    for f in sorted(f):
        name, *scores = f.split(',')
        hl = list(reversed(scores))
        print (hl)

我的文本文件如下所示:

nathan ,2, 0, 10 
adil ,8, 9, 7 
masuda ,7, 4, 6 
zain ,0, 0, 3 
abdur rauf ,2, 0, 0 
danniel ,7, 7, 2

这是我运行代码时得到的结果:

> [' 0\n', ' 0', '2']
[' 7\n', ' 9', '8']
[' 2\n', ' 7', '7']
[' 6\n', ' 4', '7']
[' 10\n', ' 0', '2']
[' 3\n', ' 0', '0']

真的应该是这样的

adil  ,9, 8, 7
abdur rauf  ,2, 0, 0
danniel  ,7, 7, 2
masuda  ,7, 6, 4
nathan  ,10, 2, 0
zain  ,3, 0, 0

【问题讨论】:

  • 你不应该使用相同的clas 变量同时用于类号和排序选择。
  • 当测试互斥时,你也应该使用else if
  • 您的hl 选项在哪里按学生的分数对学生进行排序?它使用与alphabetical 相同的sorted(f)
  • 你能显示示例文件内容吗?看起来每个学生都有一个以逗号分隔的分数列表。按分数排序时应该使用哪些分数?
  • Nahid,欢迎来到堆栈。将来,此信息属于问题。这就是为什么凯文在他的评论中有edit。所以你点击你的问题下的edit,并在那里放置格式化的信息。谢谢

标签: python


【解决方案1】:
  1. sorted(f) 给你类似的东西:

    ['abdur rauf ,2, 0, 0 \n',
     'adil ,8, 9, 7 \n',
     'danniel ,7, 7, 2\n',
     'masuda ,7, 4, 6 \n',
     'nathan ,2, 0, 10 \n',
     'zain ,0, 0, 3 \n']
    

    注意有一些\n,表示换行。

    解决方案:

    只需使用str.splitlines() 喜欢:

    for f in sorted(f.read().splitlines())
    
  2. f.split(',') 给你(修复 \n 问题后):

    ['abdur rauf ,2, 0, 0 ',
    'adil ,8, 9, 7 ',
    'danniel ,7, 7, 2',
    'masuda ,7, 4, 6',
    'nathan ,2, 0, 10 ',
    'zain ,0, 0, 3 ']
    

    这不起作用,因为, 后面有一些空格。行尾还有一个空格。

    解决方案:

    使用re.split('\s*,\s*', f),删除行尾的另一个空格,可以这样使用str.strip()

    >>> for f in sorted(f.read().splitlines()):
    ...     re.split('\s*,\s*', f.strip())
    ...     
    ... 
    ['abdur rauf', '2', '0', '0']
    ['adil', '8', '9', '7']
    ['danniel', '7', '7', '2']
    ['masuda', '7', '4', '6']
    ['nathan', '2', '0', '10']
    ['zain', '0', '0', '3']
    
  3. list(reversed(scores)) 只能反转scores 列表。你应该在这里再次使用sorted()

    但是由于在 str 对象上使用sorted(如'2''3')会给你不正确的输出。例如'10' < '2'True。将它们转换为 int 对象使用map(int, scores)

    您还需要从最高到最低。然后,您可以通过以下方式启用sortedreverse 选项:

    hl = sorted(map(int, scores), reverse=True)
    

    Here's another question on SOreversedsorted(list, reverse=True)有什么区别

  4. print(hl) 只能打印该列表。在这种情况下,我认为您需要加入他们使用' ,'.join([name]+scores):

    print(' ,'.join([name]+list(map(str, hl))))  # covert `hl` elements to str objects again since we need use `str.join`
    

所以完整的代码如下:

import re

with open('class1.txt', 'r') as f:
    for f in sorted(f.read().splitlines()):
        name, *scores = re.split('\s*,\s*', f.strip())
        hl = sorted(map(int, scores), reverse=True)
        print(' ,'.join([name]+list(map(str, hl))))

输出将是:

abdur rauf ,2 ,0 ,0
adil ,9 ,8 ,7
danniel ,7 ,7 ,2
masuda ,7 ,6 ,4
nathan ,10 ,2 ,0
zain ,3 ,0 ,0

【讨论】:

  • @Nahid:好吧,如果您认为答案有帮助,请记住接受它。查看我们的tour 了解更多详情;)
  • 很抱歉,但我真的很想知道你是如何擅长编码的,这样我也可以做得很好
  • 啊,我在这里不是最好的,尝试了解更多:)。如果你有其他问题,你可以随时在这里问他们。但请记住,始终提出明确的问题。我建议您在我们的help center 中阅读一些内容,看起来我没有找到它。然后:了解更多,询问更多,回答更多。 ;)
猜你喜欢
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多