2016-07-29 91 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啊,是的,謝謝 –