Python:按类对象排序列表

2024-09-25 08:26:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为CS1做一个项目,我就要破解它了,但是这部分代码让我为难了!这个项目的目标是通过引用一个包含数千个名字的文件来创建一个在任何给定年份中排名前20的名字的列表。每个文件中的每一行都包含姓名、性别和出现的次数。这个文件是按性别分开的(所以女性的名字是按照他们的出现顺序,然后是男性的名字,按照他们的出现顺序)。我已经把代码放到了一个点上,每个条目都包含在一个列表中的一个类中(所以这个列表是一个很长的内存条目的列表)。这是我目前掌握的代码。在

class entry():
    __slots__ = ('name' , 'sex' , 'occ')

def mkEntry( name, sex, occ ):
    dat = entry()
    dat.name = name
    dat.sex = sex
    dat.occ = occ
    return dat

##test = mkEntry('Mary', 'F', '7065')
##print(test.name, test.sex, test.occ)

def readFile(fileName):
    fullset = []
    for line in open(fileName):
        val = line.split(",")
        sett = mkEntry(val[0] , val[1] , int(val[2]))
        fullset.append(sett)
    return fullset

fullset = readFile("names/yob1880.txt")
print(fullset)

现在我想知道我是否可以通过使用sort()或其他函数对这个列表进行排序,但是要根据它们的出现次数对列表进行排序吗(日期occ在每个条目中)所以在最终结果中,我将有一个独立于性别的列表,然后在这一点上,我可以打印列表中的第一个条目,因为他们应该是我要找的。有没有可能像这样对名单进行排序?在


Tags: 文件代码nametest列表排序条目val
3条回答

{Yes,你可以使用列表来排序。sort()将函数作为可选参数key。在进行比较之前,key函数应用于列表中的每个元素。例如,如果要按整数的绝对值对其进行排序,可以执行以下操作

>>> a = [-5, 4, 6, -2, 3, 1]
>>> a.sort(key=abs)
>>> a
[1, -2, 3, 4, -5, 6]

在您的例子中,您需要一个自定义的key,它将提取每个对象的出现次数,例如

^{pr2}$

(也可以使用匿名函数:fullset.sort(key=lambda d: d.occ))。然后您只需要从这个列表中提取前20个元素。在

注意,默认情况下sort按升序返回元素,您可以对其进行操作,例如fullset.sort(key=get_occ, reverse=True)

你的意思是你只想按occ分类?sort()有一个名为key的参数,可以这样做:
fullset.sort(key=lambda x: x.occ)

这将使用occ属性按降序对列表进行排序:

fullset.sort(key=lambda x: x.occ, reverse=True)

相关问题 更多 >