用于从实例列表中创建简单列表的pythonic成语是什么?

时间:2015-05-12 18:21:17

标签: python sqlalchemy list-comprehension

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

虽然实例有很多属性,但我想要一个只包含其中一个属性的新列表。我的java编码器说:

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

......当然有效。但Pythonic的答案是什么?我知道有一个单行,将这4行包含在1中,但发现它就像在谷歌上搜索"对于"。

3 个答案:

答案 0 :(得分:8)

您正在寻找所谓的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}

如果您想根据条件过滤iterable中的项目,这非常有用。

答案 1 :(得分:2)

你想做一个列表理解:

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

答案 2 :(得分:1)

除了列表理解,您还可以使用operator.attrgettermap

map(operator.attrgetter('name'), query.all())

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