Как сгенерить словарь на основе двух словарей с разным количеством параметров

Имеется два словаря с данными:

  1. REVERSE_URLS = {'INDEX_URL': "reverse('posts:home_page')",'GROUP_URL': "reverse('posts:group_list', args=[GROUP_SLUG])", 'PROFILE_URL': "reverse('posts:profile', args=[USERNAME])"}

  2. dict_values = {'page_1': 10, 'page_2': 3}

Мне нужно сформировать новый словарь, где ключами будут ключи из REVERSE_URLS, а значениями будут парметры словаря dict_values. При этом если в словаре dict_values будет больше чем 1 параметр (например их 2), то в формат ключа в получаемом словаре должен динамически изменять в зависимости от этого и быть таким: INDEX_URL_page1: 1.

В итоге ожидается вот такой словарь:

{'INDEX_URL_page1': 10, 'INDEX_URL_page2': 3, 'GROUP_URL_page1': 10, 
 'GROUP_URL_page2': 3, 'PROFILE_URL_page1': 10, 'PROFILE_URL_page2': 3}

Я пробую следующую конструкцию:

REVERSE_URLS = {
    'INDEX_URL': "reverse('posts:home_page')",
    'GROUP_URL': "reverse('posts:group_list', args=[GROUP_SLUG])",
    'PROFILE_URL': "reverse('posts:profile', args=[USERNAME])",
}
dict_values = {'page_1': 10, 'page_2': 3}
urls = {
    f'{reverse_url}_page{i}: {values}'
    for reverse_url in REVERSE_URLS.keys()
        for values in dict_values.values()
            for i in range(1, len(dict_values) + 1)}

В итоге получается совсем не то что нужно:

{'INDEX_URL_page2: 10', 'GROUP_URL_page2: 3', 'PROFILE_URL_page1: 10',
 'PROFILE_URL_page2: 10', 'INDEX_URL_page2: 3', 'PROFILE_URL_page2: 3', 
 'INDEX_URL_page1: 3', 'PROFILE_URL_page1: 3', 'GROUP_URL_page1: 3', 
 'INDEX_URL_page1: 10', 'GROUP_URL_page2: 10', 'GROUP_URL_page1: 10'}

Как это сделать?


Ответы (2 шт):

Автор решения: insolor
  1. Чтобы получался словарь вместо множества, нужно заменить f'{reverse_url}_page{i}: {values}' на f'{reverse_url}_page{i}': values
  2. Внутренние два цикла у вас дают все сочетания значений индекса i и значений из словаря dict_values (2x2 = 4 пары). Вместо этого нужен один цикл, который будет получать значения и соответствующие им номера страницы (всего две пары).

Для простоты для сначала делаем, что в dict_values ключи - сразу номера страниц:

REVERSE_URLS = {
    'INDEX_URL': "reverse('posts:home_page')",
    'GROUP_URL': "reverse('posts:group_list', args=[GROUP_SLUG])",
    'PROFILE_URL': "reverse('posts:profile', args=[USERNAME])",
}

dict_values = {1: 10, 2: 3}
urls = {
    f'{reverse_url}_page{page_index}': page_value
    for reverse_url in REVERSE_URLS.keys()
        for page_index, page_value in dict_values.items()}

print(urls)

Вывод:

{'INDEX_URL_page1': 10, 'INDEX_URL_page2': 3, 'GROUP_URL_page1': 10,
 'GROUP_URL_page2': 3, 'PROFILE_URL_page1': 10, 'PROFILE_URL_page2': 3}

Далее, для получения номеров из строк вида page_1, page_2 можно использовать регулярные выражения:

import re

...

dict_values = {'page_1': 10, 'page_2': 3}


def page_to_index(page: str) -> int:
    return int(re.search(r"page_(\d+)", page).group(1))


urls = {
    f'{reverse_url}_page{page_to_index(page)}': page_value
    for reverse_url in REVERSE_URLS.keys()
        for page, page_value in dict_values.items()}

...

Или модуль parse:

from parse import parse


def page_to_index(page: str) -> int:
    return parse("page_{:d}", page)[0]
→ Ссылка
Автор решения: SergFSM

вот такой код потестируйте, с вашим примером работает:

d = {}
for k,v in dict_values.items():
    keys = [f'{i}_{k}' for i in REVERSE_URLS]
    d.update(dict.fromkeys(keys,v))

>>> d
'''
{'INDEX_URL_page_1': 10,
 'GROUP_URL_page_1': 10,
 'PROFILE_URL_page_1': 10,
 'INDEX_URL_page_2': 3,
 'GROUP_URL_page_2': 3,
 'PROFILE_URL_page_2': 3}
→ Ссылка