Лучший способ получить данные sh в словаре python - PullRequest
1 голос
/ 13 января 2020

У меня есть четыре вещи, чтобы вывести sh на счет user_post_dict с помощью метода push_to_dict

user_post_dict= {}

def push_to_dict(user_email, post_id, question_text, question_answer):
    if user_email in user_post_dict:
        if post_id in user_post_dict[user_email]:
            user_post_dict[user_email][post_id][question_text] = question_answer
        else:
            user_post_dict[user_email][post_id] = {}
            user_post_dict[user_email][post_id][question_text] = question_answer
    else:
        user_post_dict[user_email] = {}
        user_post_dict[user_email][post_id] = {}
        user_post_dict[user_email][post_id][question_text] = question_answer

push_to_dict('abc@gmail.com',1,'what is this?', 'this is something')
push_to_dict('abc@gmail.com',2,'what is that?', 'that is something')
push_to_dict('def@gmail.com',1,'what is this?', 'this is something')
push_to_dict('def@gmail.com',2,'what is that?', 'that is something')

Есть ли лучший способ оптимизировать код или сокращение кода.

Ответы [ 4 ]

5 голосов
/ 13 января 2020

Вы можете использовать defaultdict

from collections import defaultdict


user_post_dict= defaultdict(lambda : defaultdict(defaultdict))


def push_to_dict(user_email, post_id, question_text, question_answer):
    user_post_dict[user_email][post_id][question_text] = question_answer
1 голос
/ 13 января 2020

Да, есть несколько возможностей. Лучший ответ "по духу" - defaultdict, как показано в других сообщениях. Но, честно говоря, структура данных отстойная для работы и не легко тестируемая. Во-первых, вы должны передать аргумент, а не использовать глобальную переменную. В противном случае, тестирование и повторное использование будет проблематичным c. Кроме того, структура классов могла бы быть лучше для инкапсуляции данных и обеспечения более легкого доступа.

0 голосов
/ 13 января 2020
user_post_dict= {}
def push_to_dict(user_email, post_id, question_text, question_answer):
    global user_post_dict
    if user_email not in user_post_dict:
        user_post_dict.update({user_email:{post_id:{}}})

    if post_id not in user_post_dict[user_email]:
        user_post_dict[user_email].update({post_id:{question_text: question_answer}})
    else:
        user_post_dict[user_email][post_id][question_text] = question_answer

push_to_dict('abc@gmail.com',1,'what is this?', 'this is something')
push_to_dict('abc@gmail.com',2,'what is that?', 'that is something')
push_to_dict('def@gmail.com',1,'what is this?', 'this is something')
push_to_dict('def1@gmail.com',5,'what is that?', 'that is something')
0 голосов
/ 13 января 2020
user_post_dict = {}


def push_to_dict(user_email, post_id, question_text, question_answer):
    user_post_dict.setdefault(user_email, {}).setdefault(post_id, {})[question_text] = question_answer


push_to_dict('abc@gmail.com', 1, 'what is this?', 'this is something')
push_to_dict('abc@gmail.com', 2, 'what is that?', 'that is something')
push_to_dict('def@gmail.com', 1, 'what is this?', 'this is something')
push_to_dict('def@gmail.com', 2, 'what is that?', 'that is something')

assert user_post_dict == {'abc@gmail.com': {1: {'what is this?': 'this is something'},
                                            2: {'what is that?': 'that is something'}},
                          'def@gmail.com': {1: {'what is this?': 'this is something'},
                                            2: {'what is that?': 'that is something'}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...