【问题标题】:Sort list with information from text file使用文本文件中的信息对列表进行排序
【发布时间】:2020-11-17 16:46:10
【问题描述】:

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

文本文件:

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

【问题讨论】:

  • 列表应由两列四行组成
  • 是什么阻止您甚至尝试这样做?
  • 如果您想将值作为数字进行比较,最好先有数字(即,不仅仅是包含数字的字符串)。也就是说,排序是内置的。你试过把例如python sort by attribute 进入搜索引擎?
  • “两列都按数字排序”——只有一列是数字的。您想如何对 both 进行数字排序?

标签: python python-3.x list sorting text-files


【解决方案1】:

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

首先,我对你的类做了一点修改:我添加了一个字符串表示,使打印更具可读性:

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

【讨论】:

  • 非常感谢! ?
【解决方案2】:

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

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

【讨论】:

  • 这似乎不会保留项目之间的配对。它不会产生预期的输出。
  • 谢谢!但我得到:TypeError:“list”对象的描述符“append”不适用于“str”对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2010-09-20
  • 2018-07-03
  • 1970-01-01
  • 2017-09-17
  • 2023-04-09
相关资源
最近更新 更多