2016-07-29 46 views
0

假设我有这样的:别名在列表理解和迭代

for e in some_list: 
    fct(e.my_first_property, e. e.my_second_property) 
    fct2(e.my_first_property) 

这是一个有点重复写,所以我可以使用

for e in some_list: 
    p1 = e.my_first_property 
    p2 = e.my_second_property 
    fct(p1, p2) 
    fct2(p1) 

还是有点冗长。所以,我想知道是否有一些语法,我可以在for ... in ...声明定义P1和P2对的,也许这样的:

for e in some_list with p1 as e.my_first_property, p2 as e.my_second_property: 
    fct(p1, p2) 
    fct2(p1) 

这将是列表内涵,在这里我不能使用中间变量里面特别有帮助。

我从来没有见过这样的语法,所以我猜想它不存在。但是你永远不知道...

+2

'为P1,P2中((e.my_first_property,e.my_second_property)为电子在some_list):' – vaultah

+0

'p1 as e.my_first_property'如何比'p1 = e.my_first_property'更好? –

+0

您的建议语法不会更短;您只需将代码拼凑成一条长线。 – khelwood

回答

2

您可以使用operator.attrgettermap

from operator import attrgetter 

for p1, p2 in map(attrgetter(my_first_property, my_second_property), some_list): 
    fct(p1, p2) 
    fct2(p1) 

在Python 2.x中,map返回一个列表(作为反对在Python 3.x的迭代器),这可能如果原始列表的大小很大,则不需要。因此,它可能是更优选的在适当位置与发生器表达map此:

for p1, p2 in ((e.my_first_property, e.my_second_property) for e in some_list): 
    fct(p1, p2) 
    fct2(p1) 
+0

你至少应该提到在Python 2中'map'返回一个列表,这里不需要。生成器或'itertools.imap'(在Python 2中)会更合适。 – vaultah

+0

@vaultah啊,是的,谢谢 –