繁体   English   中英

使用文本文件中的信息对列表进行排序

[英]Sort list with information from text file

我一直在从文本文件中读取类对象并将信息存储在列表中。 我的问题是:如何按数字顺序对列表进行排序。

文本文件:

Hugo 10
Isac 9
John 90
Kelly 8

代码:

class A:
    def __init__(self,name, age):
        self.name = name
        self.age = age

def sort_list():  
    a = list()        
    file = open('my_textfile.txt', 'r').readlines()       
    for k in file:
        k = k.split(' ')
        af = A(k[0], k[1])
        a.append(af)       
    return a

然后我想对我的列表进行排序,以便两列都按数字排序。 像这样:

Kelly 8
Isac 9
Hugo 10
John 90

这是使用您建议的代码的一种解决方案。 将数据分成两部分进行排序,然后再将其重新组合在一起。 还有其他方法可以用熊猫来做到这一点。

class A:
    def __init__(self,name, age):
        self.name = name
        self.age = age
def sort_list():  
    a = list()        
    name = list()
    data = list()
    file = open('my_textfile.txt', 'r').readlines()       
    for k in file:
        k = k.split(' ')
        name.append(k[0])
        data.append(k[1])
    name.sort()
    data.sort()
    length = len(name)
    for i in range(length):
        af = A(name[i], data[i])
        a.append(af)
    return a

您现在很可能已经找到了解决方案。 如果没有,让我提出一些建议。

首先,我对您的类进行了轻微修改:我添加了一个字符串表示,使打印内容更具可读性:

class A:

    def __repr__(self):
        return f"A('{self.name}', {self.age})"

    def __init__(self, name, age):
        self.name = name
        self.age = age

您不需要为以下内容!

现在排序:

def sort_list():
    lst = list()
    lines = open('my_textfile.txt', 'r').readlines()
    for line in lines:
        line = line.split()
        lst.append(A(line[0], int(line[1])))
    lst.sort(key=lambda a: (a.age, a.name))
    return lst

除了重命名一些变量外,我还进行了以下调整:

  • 我将字符串的第二部分转换为int因为我认为这就是您真正想要的( int(line[1]) )。
  • 将所有数据附加到列表后,它会被排序。 列表有一个sort方法,但在你的情况下,你必须给它一些关于如何排序的提示,因为元素是一个新类。 提示是给sort的可选key参数的 lambda 函数。 它为列表的每个元素返回元组(a.age, a.name) sort然后实际上根据这个值进行排序。 由于年龄是第一个,排序首先看起来是它,结果是最终列表中的年龄增加。 对于年龄相同的条目,按名称的字母顺序进行排序。

的结果

lst = sort_list()
print(lst)

[A('Kelly', 8), A('Isac', 9), A('Hugo', 10), A('John', 90)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM