0

クラスstatを使用してデータを保持する次のコードがあります。タイプのオブジェクトがstatリストに挿入されます。ただし、メソッドを呼び出そうとするとprintStats、エラーが発生しますAttributeError: stat instance has no attribute 'printStats'。次に、のオブジェクトを含むリストを並べ替える方法を知りたいですstatblocks私のソートは、のフィールドに基づく必要がありstatます。

fi = open( 'txt/stats.txt', 'r' )
fo = open( 'compile/stats.txt', 'w' )
list = []

class stat():
    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)

while True:
    line_str = fi.readline()
    if line_str == '':
        break

    str = line_str.split()
    list.append( stat(str[0], int(str[1]), int(str[2])) )

for item in list:
    item.printStats() # <-- problem calling this
4

3 に答える 3

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)
于 2012-08-15T13:01:52.723 に答える
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'
于 2012-08-15T12:37:41.257 に答える
0

この関数printStatsは実際にはクラスの一部ではありませんstat。これは、クラスの残りの部分がスペース インデントを使用しているのに対し、タブ付きインデントを使用しているためです。試してみるprint dir(stat)と、それがないことがわかりますprintStats。これを修正するには、クラス全体で一貫するようにタブ スタイルを変更します。

次の行も確認する必要があります。

str = line_str.split()

組み込み型strを独自のリストで上書きしています。strその結果、 を使用して文字列に変換することはできなくなりました。の呼び出しprintStatsに成功すると、 が返されますTypeErrorstr変数の名前を別のものに変更します。

于 2012-08-15T12:45:54.353 に答える