Python:按类对象排序列表

时间:2013-10-11 02:06:59

标签: python list class sorting

为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()或其他函数对此列表进行排序,但是按照它们的出现(每个条目中的dat.occ)对列表进行排序,以便在最终结果中我将列出一个独立于性别的列表,然后在那时我可以打印列表中的第一个条目,因为它们应该是我正在寻找的。是否可以像这样对列表进行排序?

4 个答案:

答案 0 :(得分:2)

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

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

在您的情况下,您需要一个自定义key来提取每个对象的出现次数,例如

def get_occ(d): return d.occ
fullset.sort(key=get_occ)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我想你只想对每个对象的'occ'属性的值进行排序,对吧?您只需要将key关键字参数用于Python可用的任何各种排序函数。例如

getocc = lambda entry: entry.occ
sorted(fullset, key=getocc)
# or, for in-place sorting
fullset.sort(key=getocc)

或者有些人可能认为使用operator.attrgetter而不是自定义lambda更加pythonic:

import operator
getocc = operator.attrgetter('occ')
sorted(fullset, key=getocc)

但听起来这个名单非常大。如果您只想要列表中的前几个条目,则排序可能是不必要的昂贵操作。例如,如果您只想要第一个值,则可以在O(N)时间内获得该值:

min(fullset, key=getocc) # Same getocc as above

如果你想要前三个,比如说,你可以use a heap而不是排序。

import heapq
heapq.nsmallest(3, fullset, key=getocc)

堆是一种有用的数据结构,用于从列表中获取一片有序元素而不对整个列表进行排序。上述内容相当于sorted(fullset, key=getocc)[:3],但如果列表很大则更快。

希望显而易见的是,您可以使用heapq.nlargest和相同的参数获得三个最大值。同样,您可以撤消任何排序或将min替换为max

答案 3 :(得分:0)

你的意思是你只想通过occ对列表进行排序? sort()有一个名为key的参数,你可以这样做:
fullset.sort(key=lambda x: x.occ)