15

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

在 C# 中我会写

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

我将如何在 Python 中做到这一点?

4

5 回答 5

20

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

如果您的起始列表被调用original_list并且您的新列表被调用id_list,您可以执行以下操作:

id_list = [x.id for x in original_list]
于 2010-11-23T22:11:33.293 回答
14
[obj.id for obj in myObjects]
于 2010-11-23T22:11:57.707 回答
7

如果它是一个大列表,并且您只需要处理一次 id,那么还有生成器表达式。

ids = (obj.id for obj in my_objects)

for id in ids:
    do_something(id)

生成器表达式不支持随机访问,但会根据需要为您获取每个 id,因此可以避免一次构建一个列表。生成器表达式 toxrange就像列表推导式 to 一样range

生成器表达式的另一个警告是,只要其中的任何资源仍处于打开状态,就可以访问它。例如,以下代码将失败。

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

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

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

于 2010-11-23T22:15:51.687 回答
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"))
于 2011-06-06T20:04:10.513 回答
1

没有人会按照以下方式这样做,但如果它在更复杂的示例中派上用场

import operator
map(operator.attrgetter("id"), myObjects)
于 2010-11-23T23:34:53.223 回答