我有一個Python對象列表,它們每個都有一個id
屬性。我想獲得這些ID的列表。Python等價於C#的選擇?
在C#中我會寫
myObjects.Select(obj => obj.id);
我怎麼會在Python這樣做呢?
我有一個Python對象列表,它們每個都有一個id
屬性。我想獲得這些ID的列表。Python等價於C#的選擇?
在C#中我會寫
myObjects.Select(obj => obj.id);
我怎麼會在Python這樣做呢?
[obj.id for obj in myObjects]
退房「列表理解」這裏的部分:http://docs.python.org/tutorial/datastructures.html
如果您的首發名單中被稱爲original_list
和新的列表被稱爲id_list
,你可以做這樣的事情:
id_list = [x.id for x in original_list]
如果它是一個大列表,你只需要處理一次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
在這種情況下等效的列表理解將起作用。
沒有人在他們的腦子會做到這一點下面的方式,但在這裏,如果你想要的C#直接等同於Python的選擇是在情況下,它派上用場的一個更復雜的例子
import operator
map(operator.attrgetter("id"), myObjects)
,以使用第三方庫爲代價,你可以使用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"))
的權利..列表內涵。忘了那些:) – mpen 2010-11-23 22:13:24