2013-04-26 4 views
4

Я ищу функцию addproperty(property_str, property_dict, old_dict = None), где мне нужны аргументы, строка, один словарь и один дополнительный словарь. Функция должна возвращать новый словарь, где соответствующие значения добавляются в дополнительный словарь.Словарь в словаре в Python 3

Например. Если я вхожу:

capitals_dict = {'USA': 'Washington', 'Russia': 'Moscow', 'Japan': 'Tokyo'} 

Функция addproperty('capital', capitals_dict) должна возвращать следующие словарю

{'USA': {'capital': 'Washington'}, 'Russia': {'capital': 'Moscow'}, 'Japan': {'capital': 'Tokyo'}} 

мне нужно, чтобы иметь возможность расширить такой словарь, чтобы добавить новые детали в этих странах, когда я вхожу, что словарь в необязательный параметр.

Например:

old_dict = {'USA': {'capital': 'Washington'}, 'Russia': {'capital': 'Moscow'}, 'Japan': 'capital': 'Tokyo'}} 
demonym_dict = {'USA': 'American', 'Russia': 'Russian', 'Japan': 'Japanese'} 

Тогда addproperty('demonym', demonym_dict, old_dict) нужно вернуть:

{'USA': {'capital': 'Washington', 'demonym': 'American'}, 'Russia': {'capital': 'Moscow', 'demonym': 'Russian'}, 'Japan': {'capital': 'Tokyo', 'demonym': 'Japanese'}} 

Как я должен начать здесь?

+1

Есть ли причина, по которой эти две очень разные операции должны быть одной и той же функцией с необязательным параметром? – abarnert

+0

Образовательная причина, ничего больше. –

ответ

5
def addproperty(property_str, property_dict, old_dict=None): 
    result = old_dict if old_dict is not None else {} 
    for k, v in property_dict.items(): 
     result.setdefault(k, {})[property_str] = v 
    return result 

Например:

>>> capitals_dict = {'USA': 'Washington', 'Russia': 'Moscow', 'Japan': 'Tokyo'} 
>>> result = addproperty('capital', capitals_dict) 
>>> result 
{'Japan': {'capital': 'Tokyo'}, 'Russia': {'capital': 'Moscow'}, 'USA': {'capital': 'Washington'}} 
>>> demonym_dict = {'USA': 'American', 'Russia': 'Russian', 'Japan': 'Japanese'} 
>>> addproperty('demonym', demonym_dict, result) 
{'Japan': {'demonym': 'Japanese', 'capital': 'Tokyo'}, 'Russia': {'demonym': 'Russian', 'capital': 'Moscow'}, 'USA': {'demonym': 'American', 'capital': 'Washington'}} 

Обратите внимание, что это изменит old_dict, если это предусмотрено. Если это импорт проблема модуля копирования и заменить первую строку в функции со следующим:

result = copy.deepcopy(old_dict) if old_dict is not None else {} 
+0

Большое спасибо. Я также знаю, что некоторые люди будут использовать функцию 'zip' здесь. Ваш метод даже кажется короче. Интересно, какой будет самый «питонический». –

+0

Ну, факт, что он изменяет old_dict, здесь не проблема. Всякий раз, когда он «обновляется», этот old_dict бесполезен. Именно то, что мне нужно. Тем не менее, я буду иметь в виду модуль 'copy' для будущего. Еще раз спасибо за вашу помощь. –

+0

Вы должны изменить свой вопрос, чтобы уточнить, потому что вы говорите: «Функция должна вернуть ** новый ** словарь». Как можно использовать 'zip()' здесь? Это, конечно, не похоже на естественное использование zip. Может быть, вы должны написать ответ, который показывает нам. –

0

Что-то вроде этого:

def add_property(item,dic,new_dic=None): 
    if not new_dic: 
     for k,v in dic.items(): 
      dic[k]={item:v} 
    else:   
     for k,v in dic.items(): 
      dic[k].update({item:new_dic[k]}) 
    .....:    

In [124]: capitals_dict = {'USA': 'Washington', 'Russia': 'Moscow', 'Japan': 'Tokyo'} 

In [125]: add_property("Capital", capitals_dict) 

In [126]: add_property("demonym",capitals_dict,demonym_dict) 

In [128]: capitals_dict 
Out[128]: 
{'Japan': {'Capital': 'Tokyo', 'demonym': 'Japanese'}, 
'Russia': {'Capital': 'Moscow', 'demonym': 'Russian'}, 
'USA': {'Capital': 'Washington', 'demonym': 'American'}} 
2

Моего сумасшедшее решения однострочного :)

def addproperty(property_str, property_dict, old_dict = None): 
    return {k: (lambda k, v: old_dict[k] if old_dict != None else { property_str: v})(k,v) for k, v in property_dict.items()} 

Возвращает новый словарь.

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