1

我有以下多循环情况:

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

有没有办法把下面的内容写成理解或地图,看起来会更好(希望表现更好)

4

4 回答 4

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)

于 2013-05-30T04:08:46.073 回答
2

假设您真的是要通知以累积所有结果

return {m.name: [func(g, m) for g in groups] for m in messages}
于 2013-05-30T04:40:22.717 回答
1

您不希望返回字典吗?如下(假设m有字段名)

notify={m.name:[func(g,m) for g in groups] for m in messages}
于 2013-05-30T04:39:51.180 回答
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
于 2013-05-30T04:49:52.060 回答