Неправильный вывод при добавлении элементов в словарь словаря в Python - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть этот пустой dictionary of dictionary в python, и я пытаюсь добавить / добавить элементы к нему. У отдельного внутреннего словаря в качестве значения ключа есть список.

Пустая структура моего dict of dict:

grp_task_text_dict = {'Group 1': {}, 'Group 2': {}}

Вот мой текущий код, который читает элементы и, основываясь на определенных условиях, должен добавить этот элемент к Group 1 или Group 2:

def text_mapping_bot2():

    group_list = ['Group 1','Group 2']
    task_text_dict = {}
    grp_task_text_dict = {i: task_text_dict for i in group_list}
    grp_mapping = {i: [] for i in group_list}

    print('EMPTY GROUP TASK TEXT DICT = {}'.format(grp_task_text_dict))

    bot_mapping = [{'Name': '', 'Task ID': '0','Task Text': 'Try again!', 'Group': '', 'Complementary Action': ''}, {'Name': 'Hello', 'Task ID': '1.0','Task Text': 'Hi, Welcome', 'Group': 'Group 2', 'Complementary Action': 'group'}, {'Name': 'Hello', 'Task ID': '11.0', 'Task Text': 'Tell me about car options? ', 'Group': 'Group 2', 'Complementary Action': ''}, {'Bot Name': 'Hello', 'Task ID': '11.0', 'Task Text': 'What are different car options?', 'Group': 'Group 2', 'Complementary Action': ''}, {'Name': 'Hello', 'Task ID': '11.0','Task Text': 'What cars are there?', 'Group': 'Group 2','Complementary Action': ''}, {'Name': 'Hello', 'Task ID': '11.0','Task Text': 'May I know about Car types?', 'Group': 'Group 2','Complementary Action': ''}, {'Name': 'Hello', 'Task ID': '2.0', 'Task Text': 'How much is the rent of compact car? ', 'Group': 'Group 2','Complementary Action': ''}, {'Name': 'Hello', 'Task ID': '2.0','Task Text': 'Compact car expenses?', 'Group': 'Group 2', 'Complementary Action': ''}, {'Name': 'Hello', 'Task ID': '2.0', 'Task Text': 'Cost of compact car?', 'Group': 'Group 2', 'Complementary Action': ''}, {'Name': 'Hello', 'Task ID': '2.0','Task Text': 'How much do I need to pay for small car', 'Group': 'Group 2', 'Complementary Action': ''}]

    for item in bot_mapping:
        print("ITEM IN BOT MAPPING = {}".format(item))
        print('\n')
        print('\n')

        for grp, val in grp_task_text_dict.items():
            print('CURRENT VAL = {} and GROUP = {}'.format(val, grp))
            try:
                if last_id < int(float(item['Task ID'])):
                    last_id = int(float(item['Task ID']))
            except:
                pass
            try:
                if item['Task ID'] == '':
                    item['Task ID'] = '0'
                if (item['Task ID'] in val) and (str(item['Group']).lower() == str(grp).lower()):

                    print('\n')

                    print('CURRENT STATUS OF GROUP TASK TEXT DICT BEFORE APPENDING= {}'.format(
                        grp_task_text_dict))
                    print('\n')

                    print('GROUP AND TASK ID ALREADY IN ITEM AND TASK TEXT DICT IS SAME - {} and {}'.format(
                        str(item['Group']).lower(), str(grp).lower()))
                    print('\n')

                    print('APPENDING TO THIS GROUP IN GRP TASK DICT = {}'.format(grp_task_text_dict[grp][item['Task ID']]))

                    # val[item['Task ID']].append(item['Task Text'])
                    grp_task_text_dict[grp][item['Task ID']].append(item['Task Text'])
                    print('CURRENT STATUS OF GROUP TASK TEXT DICT AFTER APPENDING= {}. Going to Break out of loop'.format(
                        grp_task_text_dict))
                    break
                elif str(item['Group']).lower() == str(grp).lower():
                    print('CURRENT STATUS OF GROUP TASK TEXT DICT BEFORE APPENDING IN NEW TASK ID= {}'.format(
                        grp_task_text_dict))
                    print('\n')
                    print('NEW TASK ID BUT GROUP SAME = {} and {}'.format(str(item['Group']).lower(), str(grp).lower()))
                    print('\n')

                    print('APPENDING TO THIS GROUP IN GRP TASK DICT IN NEW ID = {}'.format(grp_task_text_dict[grp]))
                    print('\n')

                    # val[item['Task ID']] = [item['Task Text']]
                    grp_task_text_dict[grp][item['Task ID']] = [item['Task Text']]
                    print(
                        'CURRENT STATUS OF GROUP TASK TEXT DICT AFTER APPENDING IN NEW TASK ID = {}. Going to Break out of loop'.format(
                            grp_task_text_dict))
                    break
            except Exception as e:
                print("THIS EXCEPTION CAME = {}".format(e))
                # print('--iteration check--', task_text_dict)

Я хочу, чтобы на основе Group, поданных в каждом item в bot_mapping, код должен либо добавить его в список, связанный с Task ID этого группового словаря в grp_task_text_dict, если Task ID уже существует в этом групповом словаре, или создайте новый список с новым Task ID в соответствующем групповом словаре в grp_task_text_dict. Так, например, если Group в элементе - Group 2, а Task ID - 11.0, то этот элемент должен быть добавлен в список Task ID 11.0 в Group 2 словаре grp_task_text_dict, а не в Group 1.

Когда я выполняю этот код, он добавляет элемент в словари Group 1 и Group 2, даже если мой код добавляется к определенной группе, используя grp_task_text_dict[grp][item['Task ID']].append(item['Task Text']) после сопоставления имени Group, используя if (item['Task ID'] in val) and (str(item['Group']).lower() == str(grp).lower()):.

Пример вывода моего кода выглядит следующим образом:

ITEM IN BOT MAPPING = {'Bot Name': 'Hello', 'Task ID': '11.0', 'Task Text': 'What are different car options?', 'Group': 'Group 2', 'Complementary Action': ''}




CURRENT VAL = {'1.0': ['Hi, Welcome'], '11.0': ['Tell me about car options? ']} and GROUP = Group 1
CURRENT VAL = {'1.0': ['Hi, Welcome'], '11.0': ['Tell me about car options? ']} and GROUP = Group 2


CURRENT STATUS OF GROUP TASK TEXT DICT BEFORE APPENDING= {'Group 1': {'1.0': ['Hi, Welcome'], '11.0': ['Tell me about car options? ']}, 'Group 2': {'1.0': ['Hi, Welcome'], '11.0': ['Tell me about car options? ']}}


GROUP AND TASK ID ALREADY IN ITEM AND TASK TEXT DICT IS SAME - group 2 and group 2


APPENDING TO THIS GROUP IN GRP TASK DICT = ['Tell me about car options? ']
CURRENT STATUS OF GROUP TASK TEXT DICT AFTER APPENDING= {'Group 1': {'1.0': ['Hi, Welcome'], '11.0': ['Tell me about car options? ', 'What are different car options?']}, 'Group 2': {'1.0': ['Hi, Welcome'], '11.0': ['Tell me about car options? ', 'What are different car options?']}}

Как вы можете видеть выше, он добавляется к Group 1 и Group 2, когда он должен добавляться только к Group 2.

Я знаю, что в моей логике есть какая-то ошибка, но я не могу понять, в чем и в чем заключается проблема, которая вызывает неправильный вывод. Любая помощь?

1 Ответ

0 голосов
/ 09 ноября 2018

Проблема в этой строке:

grp_task_text_dict = {i: task_text_dict for i in group_list}

Это заставляет все элементы в этом словаре ссылаться на один и тот же task_text_dict словарь, они не получают копии. Измените его на:

grp_task_text_dict = {i: {} for i in group_list}

Затем он инициализирует каждый элемент словаря своим собственным пустым словарем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...