2014-09-24 71 views
1

在下面的代碼中,我創建了一個包含三個對象的列表,並使用變量a,b,c通過它們的id存儲第一個,第二個,然後第三個對象,但是當我嘗試將第三個對象存儲在變量c中,它存儲第二個和第三個對象的列表。Python:通過id從對象列表中檢索

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包含兩個對象?

回答

2

使用字典可能是在這種情況下,最好的辦法,由邁扎特提及。然而,你可以用類似的方式去做你想要使用列表解析的東西:

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 
+0

除了我提供的例子之外,我所面臨的主要問題是我需要從對象內部的對象列表中提取id此解決方案效果最佳。無需將列表轉換爲字典,您的代碼是最高效的,並且完全符合我的需求。 – Rmor91 2014-09-24 04:02:15

+0

我會添加一件東西,從列表中檢索對象:a = [e for list1中的e,如果e.id!=「obj1」] [0]。否則變量存儲1個對象的列表 – Rmor91 2014-09-24 04:31:02

+0

很高興幫助。請注意,對於您構建的每個新列表,列表理解必須迭代列表中的每個元素。對於小列表來說很好,但是如果你有很大的列表,它可能會很慢。一個簡單的字典查詢可以在不變的時間內運行,所以如果可能的話,這對於大量的對象來說更好。 – JKillian 2014-09-24 04:31:54

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>] 
>>> 

真是1和False是0的索引:

這裏是例如:

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

所以,列表[真:]是等於從第一個元素到最後一個元素的列表[1:]。

在你的情況下,列表1中的最後兩個元素。

2

我敢打賭你對Python很熟悉。

id!='obj1'and id!='obj2'返回在Python中等於1的真,也就是說,c=list1[id!='obj1'and id!='obj2':]等於c=list1[1:],這當然有兩個對象。

順便說一句,id是一個內置函數的名稱。請避免使用它作爲varible的名稱。

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] 
+0

順便說一句,你不要回答他正在試圖找到的東西:)而他選擇這個答案真的嗎?他的問題是:爲什麼變量c包含兩個對象? – 2014-09-24 03:47:37

+0

儘管其他答案解釋瞭如何將布爾值作爲整數使用,但此答案最好解決了使用對象ID從列表/字典中進行選擇的主要問題。 – Rmor91 2014-09-24 03:48:30

+2

當您瞭解他正在嘗試執行的操作時,它仍然是有效的答案將他引導到正確的路徑。 – 2014-09-24 03:48:54