2017-10-09 190 views
0

我不太熟悉Python,所以请原谅我,如果这两件事情是不相关的。Python列表理解和SQLALCHEMY

我正在第一次使用ORM(SQLALCHEMY),它很有趣但很混乱。今天我遇到了一个奇怪的问题,我很困惑,但希望有人能为我清理它。基本上我想知道这之间的区别是什么:

[[x.item for x in y.items] for y in yy] 

这:

[x.item for x in [y.items for y in yy]] 

基本上,yy是结果集的查询(Y.query.all())和物品是在sqlalchemy db模型中定义的关系。在第二个循环中,我被告知x没有属性项,但是在第一个循环中,我的代码是有效的。我很高兴我终于可以实现这个目标,但是我很困惑它为什么会起作用。

在这两种情况下,y.items是否应该具有相同的值?

在列表理解中是否从左到右嵌套?

+2

https://stackoverflow.com/questions/8049798/understanding-nested-list-comprehension – ayhan

回答

2

严格地说,注意[[x.item for x in y.items] for y in yy]相当于

list_ = [] 
for y in yy: 
    list_.append([x.item for x in y.items]) 

好了点。


虽然 [x.item for x in [y.items for y in yy]],相当于

list_ = [] 
for x in [y.items for y in yy]: 
    list_.append(x.item) 

或把不同,使用比x

list_ = [] 
for y_items in [y.items for y in yy]: 
    list_.append(y_items.item) 

是否每个y_items拥有的财产item一个更有意义的名字吗?不,不是的。 反向y_items中包含的每个元素的确如前所述称为“第一循环”,即[x.item for x in y.items]


总之,

不应该y.items在这两种情况下相同的值?

没有因为在“第一圈”,你得到的y.items每个元素的item财产而在“第二循环”你(尝试)获得的y.itemsitem财产本身。

+1

太棒了!这很有道理,谢谢 –