Как сгенерить словарь на основе двух словарей с разным количеством параметров
Имеется два словаря с данными:
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}
Мне нужно сформировать новый словарь, где ключами будут ключи из 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 шт):
- Чтобы получался словарь вместо множества, нужно заменить
f'{reverse_url}_page{i}: {values}'наf'{reverse_url}_page{i}': values - Внутренние два цикла у вас дают все сочетания значений индекса
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]
вот такой код потестируйте, с вашим примером работает:
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}