2013-05-30 52 views
1

我有以下的多回路情況:我們如何使用理解這裏

notify=dict() 
for m in messages: 
    fields=list() 
    for g in groups: 
     fields.append(func(g,m)) 
    notify[m.name]=fields 
return notify 

是否有寫下面的理解或地圖的方式,那樣會更好看(希望有更好的表現太)

+3

這裏'結果'的含義是什麼,只需要嵌套循環中的最後一個值?它應該是'result.append'嗎? – jamylak

+0

修改了代碼以提及意圖 – IUnknown

+0

您是否打算在每個循環中創建一個新的'notify'? –

回答

2

假設你真的是通知所有累積的結果

return {m.name: [func(g, m) for g in groups] for m in messages} 
+0

這非常有趣。是否有排除func()返回None的情況的方法。我不需要將這些情況添加到字典中。 – IUnknown

+0

@IUnknown,你的意思是,當一個特定的'm'的所有​​'func()'返回None時,還是僅僅爲了壓制它從單個列表中? –

2
from itertools import product 
results = [func(g,m) for m,g in product(messages,groups)] 

編輯

我想你可能真的想類型的字典詞典,而不是列表的字典:

from collections import defaultdict 
from itertools import product 
results = defaultdict(dict) 
for m,g in product(messages,groups): 
    results[m.name][g] = func(g,m) 

或照搬gnibbler:

return {m.name: {g:func(g,m) for g in groups} for m in messages} 

現在你可以使用results[msgname][groupname]得到的func(g,m)值。

+0

非常有趣 - 但我無法將它應用到當前的場景中。我想它不能比我當時所做的更簡潔。 – IUnknown

+0

如果'func'非常昂貴,可以通過記憶'func'來懶惰地初始化這個結構。那麼你只會計算實際需要的值,而不是詳細計算所有消息名稱組合的func。 – PaulMcG

1

難道你不想讓字典被返回嗎?如下(假設m的字段名)

notify={m.name:[func(g,m) for g in groups] for m in messages} 
0

不使用解析,但簡化了你的代碼位。

from collections import defaultdict 

def foo(messages, groups): 

    notify=defaultdict(list) 
    for m in messages: 
     for g in groups: 
      notify[m.name].append(func(g,m)) 
    return notify