从实例列表中创建一个简单列表的 pythonic 习惯用法是什么?

What's the pythonic idiom for making a simple list out of a list of instances?

我有一个 SQLAlchemy 返回的记录实例列表。

虽然实例有很多属性,但我想要一个只有一个属性的新列表。我的 java 程序员说:

my_records = query.all()
names = []
for my_record in my_records:
    names.append(my_record.name)

...当然有效。但是 Pythonic 的答案是什么?我知道有一个将这 4 行合并为 1 行的单行代码,但发现它就像在谷歌上搜索 "for".

您正在寻找所谓的list comprehension:

names = [my_record.name for my_record in query.all()]

以上是您示例中 for 循环的简明等价物。


此外,您应该知道还有 dict comprehensions:

{key:val for key, val in iterable}

以及set comprehensions:

{item for item in iterable}

这将分别构造新的字典和集合。


最后,所有这些构造都允许您为每个项目添加要测试的可选条件:

[item for item in iterable if condition]
{key:val for key, val in iterable if condition}
{item for item in iterable if condition}

如果你想按条件过滤可迭代对象中的项目,这很有用。

您想做一个列表理解:

result = [my_record['name'] for my_record in query.all()]

或者,您可以使用 operator.attrgetter and map:

来理解列表
map(operator.attrgetter('name'), query.all())

(但列表理解变体更容易阅读 IMO。)