Python相当于C#的.Select?

时间:2010-11-23 22:10:17

标签: c# python linq enumerable

我在Python中有一个对象列表,每个对象都有一个id属性。我想获得这些ID的列表。

在C#中我写了

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

我将如何在Python中执行此操作?

5 个答案:

答案 0 :(得分:19)

在此处查看“列表理解”部分:http://docs.python.org/tutorial/datastructures.html

如果您的起始列表名为original_list,而您的新列表名为id_list,则可以执行以下操作:

id_list = [x.id for x in original_list]

答案 1 :(得分:10)

[obj.id for obj in myObjects]

答案 2 :(得分:7)

如果它是一个大的列表,你只需要处理一次id,那么也有生成器表达式。

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

在这种情况下,等效列表理解将起作用。

答案 3 :(得分:3)

如果你想在Python中直接使用C#select,那么以使用第三方库为代价,你可以使用asq包,它提供了一个基于Python的迭代的LINQ-for-objects启发实现。使用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"))

答案 4 :(得分:1)

没有正确思想的人会通过以下方式做到这一点,但这里是为了防止它在一个更复杂的例子中派上用场

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