Python:通过id从对象列表中检索

时间:2014-09-24 03:17:35

标签: python list python-2.7

在下面的代码中,我创建了一个包含三个对象的列表,并使用变量a,b,c来存储第一个,第二个,然后是第三个对象的id,但是当我尝试存储第三个对象时在变量c中,它存储第二个和第三个对象的列表。

class Obj1():
    id='obj1'

class Obj2():
    id='obj2'

class Obj3():
    id='obj3'

list1=[Obj1(),Obj2(),Obj3()]

a=list1[id=="obj1"]
print a

b=list1[id!='obj1']
print b

c=list1[id!='obj1'and id!='obj2':]
print c

当我运行此代码时,我得到:

<__main__.Obj1 instance at 0x02AD5DA0>
<__main__.Obj2 instance at 0x02AD9030>
[<__main__.Obj2 instance at 0x02AD9030>, <__main__.Obj3 instance at 0x02AD90A8>]

为什么变量c包含两个对象?

4 个答案:

答案 0 :(得分:2)

我打赌你很熟悉Python。

id!='obj1'and id!='obj2'返回true,在Python中等于1,也就是说,c=list1[id!='obj1'and id!='obj2':]等于c=list1[1:],当然有两个对象。

BTW,id是内置函数的名称。请避免将其用作变量名称。

答案 1 :(得分:2)

您应该使用字典:

obj1 = Obj1()
obj2 = Obj2()
obj3 = Obj3()
list1 = {obj1.id: obj1, obj2.id: obj2, obj3.id: obj3}

然后像这样访问你的对象:

a = list1[obj1.id]
b = list1[obj2.id]
c = list1[obj3.id]

答案 2 :(得分:2)

正如Medhat所提到的,在这种情况下使用字典可能是最好的主意。但是,您可以采用与使用列表推导尝试的方式类似的方式执行操作:

a = [e for e in list1 if e.id == "obj1"]
print a

b = [e for e in list1 if e.id != "obj1"]
print b

c = [e for e in list1 if e.id != "obj1" and e.id != "obj2"]
# Or:
# [e for e in list1 if e.id not in ("obj1", "obj2")]
print c

答案 3 :(得分:1)

您的list1包含3个元素:

>>> list1
[<__main__.Obj1 instance at 0x103437440>, <__main__.Obj2 instance at 0x1034377a0>,         <__main__.Obj3 instance at 0x103437320>]
>>> id!='obj1'
True
>>> id!='obj2'
True
>>> True and True
True
>>> list1[True:]
[<__main__.Obj2 instance at 0x1034377a0>, <__main__.Obj3 instance at 0x103437320>]
>>>

True为1,False为0索引:

以下是示例:

>>> ls = [1,2]
>>> ls[True]
2
>>> ls[False]
1
>>>

因此,list [True:]等于list [1:],它是从第一个元素到最后一个元素。

在你的情况下,list1中的最后两个元素。