【问题标题】:Sorting objects of a class based on a particular attribute根据特定属性对类的对象进行排序
【发布时间】:2015-02-17 15:52:50
【问题描述】:

我想将类的实例存储到文件中,然后读取数据并根据特定属性按升序显示。

Description of the class: vehicle
Attributes: vehicle type, fuel type, cost
Methods:  GetVdata(), ShowVdata() 

我一直无法按照成本要求对输出数据进行排序。

 ​import pickle

class vehicle:
    vehicletype = ''
    fueltype = ''
    cost = 0
    def __init__(self, vehicletype = '', fueltype = '', cost = 0):
        self.vehicletype = ''
        self.fueltype = ''
        self.cost = 0
    def GetVdata(self):
        self.vehicletype = raw_input("enter the vehicle type: ")
        self.fueltype = raw_input("enter the fuel type: ")
        self.cost = input("enter the cost of the vehicle: ")
    def ShowVdata(self):
        print "vehicle type : ", self.vehicletype, "\n" , "fuel type: ", self.fueltype , "\n", "cost : ", self.cost
#v = vehicle()
#v.GetVdata()
#v.ShowVdata()


dat1 = vehicle("4 wheeler", "diesel" , 2000000)
dat2 = vehicle("2 wheeler", "petrol" , 100000)
dat1.GetVdata()
dat2.GetVdata()


File = open('transport.dat' , 'wb')
pickle.dump(dat1, File)
pickle.dump(dat2, File)
File.close()

dat1 = vehicle()
File = open('transport.dat','rb')
try:
    while True:
        print"\n"
        output = pickle.load(File)
        output.ShowVdata()
except EOFError:
    File.close()

【问题讨论】:

    标签: python list class instance


    【解决方案1】:

    为了根据属性对类的对象进行排序,您可以使用operator.attrgetter 方法。但是,如果您不想导入任何内容,只需将对象的cost 属性放在一个列表中,然后对该列表进行排序。然后在此基础上找到dump的对应对象。这是一个工作代码:

    import pickle
    class vehicle:
        def __init__(self, vehicletype, fueltype, cost):
            self.vehicletype = vehicletype
            self.fueltype = fueltype
            self.cost = cost
        def GetVdata(self):
            self.vehicletype = raw_input("enter the vehicle type: ")
            self.fueltype = raw_input("enter the fuel type: ")
            self.cost = input("enter the cost of the vehicle: ")
        def ShowVdata(self):
            print "vehicle type : ", self.vehicletype, "\n" , "fuel type: ", self.fueltype , "\n", "cost : ", self.cost
    
    dat1 = vehicle("4 wheeler", "diesel" , 2000000)
    dat2 = vehicle("2 wheeler", "petrol" , 1000000)
    dat3 = vehicle("2 wheeler", "petrol",  5000000)
    dat4 = vehicle("4 wheeler", "diesel",  3000000)
    
    data = [dat1, dat2, dat3, dat4]
    costs = [i.cost for i in data]
    costs.sort()
    
    File = open('transport.dat' , 'wb')
    
    for value in costs:
        for i in range(len(data)):
            if data[i].cost == value:
                pickle.dump(data[i], File)
    File.close()
    
    File = open('transport.dat','rb')
    try:
        while True:
            print"\n"
            output = pickle.load(File)
            output.ShowVdata()
    except EOFError:
        File.close()
    

    现在如果你运行它,你会得到:

    vehicle type :  2 wheeler 
    fuel type:  petrol 
    cost :  1000000
    
    
    vehicle type :  4 wheeler 
    fuel type:  diesel 
    cost :  2000000
    
    
    vehicle type :  4 wheeler 
    fuel type:  diesel 
    cost :  3000000
    
    
    vehicle type :  2 wheeler 
    fuel type:  petrol 
    cost :  5000000
    

    【讨论】:

    • 非常感谢!这是一个很大的帮助。
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多