从最高到最低

时间:2015-12-11 22:18:14

标签: python

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

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

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

我尝试了很多方法,以至于我没有意识到我在做什么。

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

1 个答案:

答案 0 :(得分:2)

  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)

    您还需要从最高到最低。然后,您可以通过以下方式启用reverse的{​​{1}}选项:

    sorted

    Here's another question on SO关于hl = sorted(map(int, scores), reverse=True) reversed

  4. 之间的区别
  5. sorted(list, reverse=True)只能打印出该列表。在这种情况下,我认为你需要加入他们' ,'.join([name]+scores)

    print(hl)
  6. 所以完整的代码如下:

    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))))