2013-05-30 5 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

Вы хотите создать новый 'уведомлять' каждый цикл? –

ответ

2

Предполагая, что вы на самом деле означает уведомить аккумулировать все результаты

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

Это очень интересно. Есть ли способ исключить случаи, когда func() возвращает None. Мне не нужны эти случаи для добавления в dict. – IUnknown

+0

@IUnknown, вы имеете в виду, когда все 'func()' для определенного 'm' return None или просто для его исключения из отдельных списков? –

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

EDIT

Я думаю, что вы, возможно, на самом деле хотите Dict из dicts, а не Dict списков:

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' стоит очень дорого, вы можете лениво инициализировать эту структуру, сохраняя memoizing' func'. Тогда вы только вычислите нужные значения, а не исчерпывающие вычисления func для всех комбинаций messagename-group. – PaulMcG

1

Не хотите, чтобы словарь возвращался? Как следует (в предположении, м имеет имя поля)

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 
Смежные вопросы