Python中类似于C#的.Select方法的等价方法是什么?

15

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

在C#中,我会写:

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

我该如何在Python中实现这个功能?

5个回答

21

15
[obj.id for obj in myObjects]

好的,列表推导式。忘记了它们 :) - mpen

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

等效的列表推导式在这种情况下也可以使用。

4
如果您想在Python中直接实现C#的select功能,但需要使用第三方库,那么您可以使用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"))

1
“没有理智的人会这样做,但如果在更复杂的情况下有用的话,这里就是它的实现方式。”
import operator
map(operator.attrgetter("id"), myObjects)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接