从实例列表中创建一个简单列表的 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}
{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。)
我有一个 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}
{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。)