我有一个 Python 中的对象列表,它们每个都有一个id
属性。我想获取这些 ID 的列表。
在 C# 中我会写
myObjects.Select(obj => obj.id);
我将如何在 Python 中做到这一点?
我有一个 Python 中的对象列表,它们每个都有一个id
属性。我想获取这些 ID 的列表。
在 C# 中我会写
myObjects.Select(obj => obj.id);
我将如何在 Python 中做到这一点?
在此处查看“列表理解”部分:http: //docs.python.org/tutorial/datastructures.html
如果您的起始列表被调用original_list
并且您的新列表被调用id_list
,您可以执行以下操作:
id_list = [x.id for x in original_list]
[obj.id for obj in myObjects]
如果它是一个大列表,并且您只需要处理一次 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
在这种情况下,等效的列表理解将起作用。
如果您想要在 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"))
没有人会按照以下方式这样做,但如果它在更复杂的示例中派上用场
import operator
map(operator.attrgetter("id"), myObjects)