2014-09-15 2 views
-1

Есть ли способ, чтобы обратиться к Dict ключам в теле инициализации с помощью одной строки и с помощью клавиш Словаря «а» и «б»словаря инициализации в питоне

Пример:

def func(a,b) 
    return {"a":longComputation1(), "b":longComputation2(), sum_a_b:?????} 

Не изменяйте семантику кода. Это просто пример.

+1

Просто напишите 2, так как вы жестко закодированы 1 и 1 .. – Maroun

+0

Ваш вопрос недостаточно ясен. Что ты пытаешься сделать? – RemcoGerlich

+0

Почему не просто: 'a = longComput1() b = longComput2() return {" a ": a," b ": b," sum_a_b ": a + b}'? –

ответ

2

Короткий ответ: нет.

Это должно быть сделано в течение нескольких линий:

def func(): 
    d = {"a": longComputation1(), 
     "b": longComputation2()} 
    d.update(sum_a_b = d['a'] + d['b']) 
    return d 
2

Используйте параметры функции:

>>> def func(a, b): 
...  return {"a": a, "b": b, "sum_a_b": a + b} 
... 
>>> func(1, 2) 
{'a': 1, 'b': 2, 'sum_a_b': 3} 

UPDATE Вопрос изменилось после того, как я разместил код выше; Используйте решение jonrsharpe.

1

Используйте функцию для создания Dict и определить имена ключей на сумму в качестве ключевого имени суммы:

def sum_dict(**kwargs): 
    result = {} 
    total = 0 
    sum_keys = kwargs["sum"] 
    del kwargs["sum"] 

    for key, value in kwargs.items(): 
     val = value() 
     result[key] = val 
     if key in sum_keys: 
      total += val 

    result["sum_" + "_".join(sum_keys)] = total 

    return result 

print(sum_dict(a=lambda: 3,b=lambda: 2,c=lambda: 14, sum=["a", "b"])) 
# {'a': 3, 'c': 14, 'b': 2, 'sum_a_b': 5} 

Для получения доступа к ключам от не созданного Словаре не представляется возможным.

Другой способ - создать собственный класс dict.

+0

Я хочу использовать ключи «a» и «b» при вычислении sum_a_b внутри тела инициализации словаря – Andigor

+0

ОК, затем посмотрите на ответ jonrsharpe – semptic

+0

Ответ jonrsharpe использует отдельную строку для вставки sum_a_b, но вопрос касался использования значений из ключа «a »и« b »внутри тела инициализации. Это не ответ на мой вопрос. – Andigor

0

Интересно, что практическое применение этого, но если вы имеете в виду, что ключ динамически строится во время инициализации других ключей, уже присутствующих в словаре:

d = {"a":longComputation1(), "b":longComputation2()} 
d['_'.join(['sum'] + d.keys())] = sum(d.values()) # assumes that keys are strings 

>>> d 
{'a': 10, 'b': 20, 'sum_a_b': 30} # assuming that longComputation1() == 10 and longComputation2() = 20 

Извините, что это не единственный line (почему ограничение?), но AFAIK вы не можете ссылаться на ключи dict во время инициализации.

+0

Да, цель вопроса - ссылаться на ключи dict во время инициализации. Если ответ «невозможно», пусть это будет – Andigor

+0

@Andigor Я думаю, что ответ не тот, но почему вы хотите это сделать? – mhawke

+0

Просто потому, что у меня есть код с «типом инициализации dict», и я не хочу менять семантику, и в одном месте я должен инициализировать член dict, только если два предыдущих были инициализированы. Если это невозможно, я могу использовать переменные переменные – Andigor

Смежные вопросы