查询/检索存储在列表中的对象(python 3.3)

时间:2014-01-12 17:52:43

标签: python list class object instance

对于我的Python简介分配,我创建了存储在列表中的类实例。我可以按列表中的位置打印或删除它们,但实际上,我需要能够查询各个属性,例如过滤掉每个属性,更改其可用性或显示每个对象的成本。我将附上一些代码:

class Vehicle():
    def __init__(self,plateno,kml,dailycost,weeklycost,weekendcost):            #attributes common to all vehicles
        self.plateno=plateno
        self.kml=kml
        self.dailycost=dailycost
        self.weeklycost=weeklycost
        self.weekendcost=weekendcost
        self.avail=True

#   methods

    def __str__(self):b
        return "Vehicle Plate Number: {0}, km/l: {1}, daily: {2},weekly: {3}, weekend: {4}".format(self.plateno, self.kml, self.dailycost, self.weeklycost, self.weekendcost)

    def __del__(self):
        return "Vehicle deleted: {0}".format(self.plateno)



class Cvn(Vehicle):
    def __init__(self,plateno,kml,bedno,dailycost,weeklycost,weekendcost):
        Vehicle.__init__(self,plateno,kml,dailycost, weeklycost, weekendcost)
        self.bedno=bedno

    def __str__(self):
        return "Caravan: Plate Number: {0}, km/l: {1}, number of beds: {2}, daily: {3},weekly: {4}, weekend: {5}, Available? {6}".format(self.plateno, self.kml, self.bedno, self.dailycost, self.weeklycost, self.weekendcost, self.avail)


#   I N S T A N C E S

  #   C A R A V A N S   Class:Cvn
  #   (self,plateno,kml,bedno,dailycost,weeklycost,weekendcost)

#------------------
#caravanheaders=["Km/l","Number of beds","Plate number","Daily cost","Weekly cost","Weekend cost"]
cvn1=[12,4,"11-D-144",50,350,200]
cvn2=[10,6,"10-D-965",50,365,285]         #values as per Caravan table
cvn3=[11,4,"12-C-143",50,350,200]
cvn4=[15,2,"131-G-111",50,250,185]

cvnslist=[cvn1,cvn2,cvn3,cvn4]    #this list contains 4 variables, each representing a list, as above
cvns=[]                           #this is going to be the list of lists

for i in cvnslist:          #this loop creates a list of lists 'cvns'
     cvns.append(i)
print("")
print(cvns)             #the list of lists

cvninstances=[]
for i in range(len(cvns)):
    cvninstances.append(Cvn(cvns[i][2],cvns[i][0],cvns[i][1],cvns[i][3],cvns[i][4],cvns[i][5]))
    vehlist.append(Cvn(cvns[i][2],cvns[i][0],cvns[i][1],cvns[i][3],cvns[i][4],cvns[i][5]))

#    print(cvninstances)  #this shows just that there are objects, but not their attibutes
#for i in cvninstances:
#    print(i)
print("")

for i in vehlist:
    print("On Vehicles List: ",i)
print("")
print("Initial fleet displayed.")
print("")

#---------------------------------------------------------------------------------

对于我来说,这里类似问题的大部分答案都处于更为先进的水平!

2 个答案:

答案 0 :(得分:0)

你会发现filter在这里很有用:

  

filter(function, iterable):根据函数返回true的iterable元素构造一个列表。 iterable可以是序列,支持迭代的容器,也可以是迭代器。如果iterable是字符串或元组,则结果也具有该类型;否则它总是一个列表。如果function为None,则假定为identity函数,即删除所有可迭代的false元素。

您可以使用lambda创建任意函数进行过滤:

matches = filter(lambda x: x.attr == val, obj_list)

这将为您提供属性attr具有值val的所有对象实例的列表。如果您想要多个可能的值,例如可能的vals

列表
lambda x: x.attr in vals

您也可以使用list comprehensions执行此操作,这在Python中非常常见:

matches = [i for i in obj_list if i.attr == val]

答案 1 :(得分:0)

事实上,我认为@sweeneyrod明白了这一点:在我看来,你的问题是访问一个实例的属性,可以这样做:

instance.attribute

如果是这种情况,请再次阅读:http://docs.python.org/2/tutorial/classes.html#instance-objects

另外,这段代码可以更优雅的方式重写:

cvninstances.append(Cvn(cvns[i][2],cvns[i][0],cvns[i][1],cvns[i][3],cvns[i][4],cvns[i][5]))

我首先重新排序你的cvn_i列表,以便参数与Cvn __init__方法的顺序相同,然后将其写为:

cvninstances.append(Cvn(*cvns[i]))

*具有以下含义:“获取cvns [i]中的所有项目并将其用作参数来实例化Cvn”

(也许这也是一个“高级” - 用你自己的话 - 但我认为这绝对是你必须要知道的模式;)


[补充]

Cf评论,过滤,使用列表理解:

[veh for veh in vehlist if veh.avail==True]

可以用更短的方式写这样(因为veh.avail意图包含一个布尔值):

[veh for veh in vehlist if veh.avail]

如果您习惯于数据库查询,这在概念上非常相似:)

[/补充]