按降序排序

时间:2015-02-21 17:52:24

标签: python

我正在整理文本文件,其中包含测验的名称和分数。 他们看起来像这样:

Tom,10
Tom,6
Tom,2
Geoff,2
Geoff,4
Geoff,9

我遇到了问题。我最近有这个程序工作,但现在它不会工作,我很难找到原因。该计划是这样的:

def highscore1():
    n = 0
    fo = open("class1.txt" , "r")
    ab = fo.readlines()
    y = len(ab)
    list1 = []
    for y in range(0,y):
        a = ab.pop()
        number = a.split(",")
        b = number.pop()
        b = int(b)
        list1.extend([(number,b)])
        list1.sort(key=lambda list1: list1[1], reverse = True)
     print(list1)

highscore1()

该程序按降序排列分数。但我一直遇到这样的问题:

Traceback (most recent call last):
  File "G:/Python Coursework/ab.py", line 16, in <module>
    highscore1()
  File "G:/Python Coursework/ab.py", line 11, in highscore1
    b = int(b)
ValueError: invalid literal for int() with base 10: '\n'

为什么我会遇到这个问题?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

首先你的功能非常低效,其次你错误的原因是你没有剥离你的线因此在分割线后你的列表中会有换行符\n!因此您会收到以下错误:

invalid literal for int() with base 10: '\n'

要摆脱这个错误,你可以strip你的行。所以(作为一种更有效的方式)您可以执行以下操作:

sorted([line.strip().split(',') for line in open("class1.txt")],key=lambda x :x[1],reverse = True)

答案 1 :(得分:0)

下列问题没有问题: -

\n出现在行列表中。只需做strip()。

在您的代码中:a = ab.pop().strip()


最后输入文件中可能有空行。可以打印ab列表进行检查。

enter image description here


重写你的代码::

代码:

def highscore1():
    p = '/home/vivek/Desktop/stackoverflow/newoneserial.txt'    
    with open(p ,"r")as fp:
        lines = fp.readlines()
        result = []
        for line in lines:
            line = line.strip()
            try:
                name, score = line.split(",")
            except ValueError:
                continue
            try:
                score = int(score)
            except ValueError:
                continue

            result.append((name,score))

        result.sort(key=lambda result: result[1], reverse = True)

        print(result)

highscore1()

输出:

vivek@vivek:~/Desktop/stackoverflow$ python 24.py 
[('Tom', 10), ('Geoff', 9), ('Tom', 6), ('Geoff', 4), ('Tom', 2), ('Geoff', 2)]

答案 2 :(得分:0)

您的代码有点令人困惑,并且包含许多错误。这是一个重写,我认为完成了你非常简洁的尝试。它也会忽略空白行和没有逗号的行。

def highscore1():
    with open("class1.txt") as fo:
        ab = fo.readlines()
    list1 = [(name, int(number)) for name, number in (pair.split(',')
                                    for pair in ab if ',' in pair)]
    list1.sort(key=lambda pair: pair[1], reverse = True)
    print(list1)

highscore1()

输出:

[('Tom', 10), ('Geoff', 9), ('Tom', 6), ('Geoff', 4), ('Tom', 2), ('Geoff', 2)]