在python中对包含类对象的列表进行排序

时间:2012-08-15 12:35:57

标签: python class sorting object

我有以下代码,我使用类stat来保存我的数据。类型stat的对象将插入列表中。但是,当我尝试调用方法printStats时,我收到错误AttributeError: stat instance has no attribute 'printStats'。其次,我想知道如何对包含stat对象的列表进行排序。我的排序应基于blocks的{​​{1}}字段。

stat

3 个答案:

答案 0 :(得分:3)

就排序而言,你肯定可以使用key函数:

import operator
lst.sort(key=lambda x: x.blocks)
lst.sort(key=operator.attrgetter('blocks') ) #alternative without lambda.

但是,如果您希望能够在非排序上下文中比较stats个对象,则可以覆盖__eq____gt____lt__(以及制作让您的生活更轻松,您可以使用functools.total_ordering类装饰器为您定义大部分比较:)

import functools
@functools.total_ordering
class stats(object): #inherit from object.  It's a good idea
    def __init__(self, fname, blocks, backEdges):
        self.fname = fname
        self.blocks = blocks
        self.backEdges = backEdges
    def printStats(self):
        print self.fname + str(self.blocks) + str(self.backEdges)
    def __eq__(self,other):
         return self.blocks == other.blocks
    def __lt__(self,other):
         return self.blocks < other.blocks

以这种方式定义stats,排序应该再次简单:

lst.sort()  #or if you want a new list:  new_lst = sorted(lst)

答案 1 :(得分:2)

list.sort(key= lambda x:x.blocks)

示例:

>>> a=stat('foo',20,30)
>>> a.printStats()
foo2030
>>> b=stat('foo',15,25)
>>> c=stat('foo',22,23)
>>> lis=[a,b,c]
>>> lis.sort(key= lambda x:x.blocks)
>>> '  '.join(str(x.blocks) for x in lis)   #sorted
'15  20  22'

答案 2 :(得分:0)

函数printStats实际上不是stat类的一部分,因为它使用选项卡式缩进,而类的其余部分使用空格缩进。试试print dir(stat),您会看到printStats缺席。要解决此问题,请更改Tab键样式,使其在整个班级中保持一致。

你也应该看看这一行:

str = line_str.split()

您正在使用自己的列表覆盖内置类型str。因此,您无法再使用str将内容转换为字符串。成功致电printStats后,它会为您提供TypeError。将str变量的名称更改为其他名称。