2010-11-23 75 views
12

我有一個Python對象列表,它們每個都有一個id屬性。我想獲得這些ID的列表。Python等價於C#的選擇?

在C#中我會寫

myObjects.Select(obj => obj.id); 

我怎麼會在Python這樣做呢?

回答

10
[obj.id for obj in myObjects] 
+0

的權利..列表內涵。忘了那些:) – mpen 2010-11-23 22:13:24

6

如果它是一個大列表,你只需要處理一次ids然後還有發生器表達式。

ids = (obj.id for obj in my_objects) 

for id in ids: 
    do_something(id) 

生成器表達式不支持隨機訪問,但會按需獲取每個ID,因此避免一次構建一個列表。發生器表達式爲xrange,列表解析爲range

對發生器表達式的一個更多警告是,只有在其中的任何資源仍處於打開狀態時,才能訪問它。例如,以下代碼將失敗。

with open(filename) as f: 
    lines = (line for line in f) 

# f is now closed 
for line in lines: 
    print line 

在這種情況下等效的列表理解將起作用。

1

沒有人在他們的腦子會做到這一點下面的方式,但在這裏,如果你想要的C#直接等同於Python的選擇是在情況下,它派上用場的一個更復雜的例子

import operator 
map(operator.attrgetter("id"), myObjects) 
2

,以使用第三方庫爲代價,你可以使用asq包,它提供了一個LINQ-for-objects啓發的實現,可以實現Python迭代。使用ASQ在你的問題的C#代碼將成爲:

from asq.initiators import query 
query(myObjects).select(lambda obj: obj.id) 

,或者與ASQ的另一個特點相結合:

from asq.selectors import a_ 
query(myObjects).select(a_("id"))