使用文本文件中的信息对列表进行排序
Sort list with information from text file
我一直在从文本文件中读取 class 个对象并将信息存储在列表中。我的问题是:如何按数字顺序对列表进行排序。
文本文件:
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
这是使用您建议的代码的一种解决方案。将数据分成两部分对其进行排序,然后再将其重新组合在一起。 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
您现在很可能已经找到了解决方案。如果没有,让我提出一些建议。
首先,我对您的 class 进行了轻微修改:我添加了一个字符串表示形式,使打印件更具可读性:
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
方法,但在你的情况下你必须给它一些关于如何排序的提示,因为元素是一个新的 class。提示是提供给 sort
的可选 key
参数的 lambda 函数。它 returns 用于列表中的每个元素元组 (a.age, a.name)
。 sort
然后实际上根据这个值排序。由于年龄排在第一位,因此排序看起来是排在第一位的,结果是最终列表中的年龄越来越大。对于年龄相同的条目,排序按姓名的字母顺序进行。
结果
lst = sort_list()
print(lst)
是
[A('Kelly', 8), A('Isac', 9), A('Hugo', 10), A('John', 90)]
我一直在从文本文件中读取 class 个对象并将信息存储在列表中。我的问题是:如何按数字顺序对列表进行排序。
文本文件:
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
这是使用您建议的代码的一种解决方案。将数据分成两部分对其进行排序,然后再将其重新组合在一起。 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
您现在很可能已经找到了解决方案。如果没有,让我提出一些建议。
首先,我对您的 class 进行了轻微修改:我添加了一个字符串表示形式,使打印件更具可读性:
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
方法,但在你的情况下你必须给它一些关于如何排序的提示,因为元素是一个新的 class。提示是提供给sort
的可选key
参数的 lambda 函数。它 returns 用于列表中的每个元素元组(a.age, a.name)
。sort
然后实际上根据这个值排序。由于年龄排在第一位,因此排序看起来是排在第一位的,结果是最终列表中的年龄越来越大。对于年龄相同的条目,排序按姓名的字母顺序进行。
结果
lst = sort_list()
print(lst)
是
[A('Kelly', 8), A('Isac', 9), A('Hugo', 10), A('John', 90)]