我有一个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