我有一个SQLAlchemy返回的记录实例列表。
虽然实例有很多属性,但我想要一个只包含其中一个属性的新列表。我的java编码器说:
my_records = query.all()
names = []
for my_record in my_records:
names.append(my_record.name)
......当然有效。但Pythonic的答案是什么?我知道有一个单行,将这4行包含在1中,但发现它就像在谷歌上搜索"对于"。
答案 0 :(得分:8)
您正在寻找所谓的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}
如果您想根据条件过滤iterable中的项目,这非常有用。
答案 1 :(得分:2)
你想做一个列表理解:
result = [my_record['name'] for my_record in query.all()]
答案 2 :(得分:1)
除了列表理解,您还可以使用operator.attrgetter
和map
:
map(operator.attrgetter('name'), query.all())
(但列表理解变体更容易阅读IMO。)