我有以下代码,我使用类stat
来保存我的数据。类型stat
的对象将插入列表中。但是,当我尝试调用方法printStats
时,我收到错误AttributeError: stat instance has no attribute 'printStats'
。其次,我想知道如何对包含stat
对象的列表进行排序。我的排序应基于blocks
的{{1}}字段。
stat
答案 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
变量的名称更改为其他名称。