#python #python-3.x #loops #dictionary #filter
#python #python-3.x #циклы #словарь #Фильтр
Вопрос:
У меня есть словарь, в котором у нас есть несколько типов ключей (в данном случае keyType1 и keyType2):
example_dict = {
"keyType2[3]": 23,
"keyType2[-1]": -21,
"keyType2[-2]": -22,
"keyType1[0]": 0,
"keyType1[2]": 2,
"keyType1[-1].subkey1": -11,
"keyType1[-1].subkey2": -12,
"keyType1[-2].subkey1": -21,
"keyType1[-2].subkey2": -22,
"keyType1[-3]": -3,
}
и они индексируются, как в списке. Моя задача — идентифицировать ключи с отрицательной индексацией в словаре, найти максимальное значение индекса для ключей того же типа и пересчитать отрицательные индексы на основе этого максимального значения.
Что у меня есть:
def example_implementation(example_dict):
negative_keys = filter(lambda x: re.search(r"[-d ]", x), example_dict.keys())
for key in negative_keys:
indexed_key, index = re.search(r"(?P<indexed_key>.*?)[-(?P<index>d )]", key).groups()
indexed_keys = [key for key in example_dict.keys() if indexed_key in key]
max_index = max(
map(lambda x: int(re.search(f"{re.escape(indexed_key)}[([d-] )]", x).group(1)), indexed_keys,)
)
if max_index < 0:
# no non-negative list elements were found
raise exceptions.KeyError
key_mappings = filter(
lambda x: x[0] != x[1],
(
map(
lambda x: (x, x.replace(f"{indexed_key}[-{index}]", f"{indexed_key}[{max_index 1}]"),),
indexed_keys,
)
),
)
for (old_key, new_key) in key_mappings:
example_dict[new_key] = example_dict.pop(old_key)
return example_dict
Реализация, для которой я работаю:
example_dict = {
"keyType1[-1].subkey1": -11,
"keyType1[-1].subkey2": -12,
"keyType1[0]": 0,
"keyType1[2]": 2,
"keyType1[-2]": -2,
"keyType2[3]": 3,
"keyType2[-1]": 34,
}
но не для
example_dict = {
"keyType2[3]": 23,
"keyType2[-1]": -21,
"keyType2[-2]": -22,
"keyType1[0]": 0,
"keyType1[2]": 2,
"keyType1[-1].subkey1": -11,
"keyType1[-1].subkey2": -12,
"keyType1[-2].subkey1": -21,
"keyType1[-2].subkey2": -22,
"keyType1[-3]": -3,
}
Результат:
{
"keyType2[3]": 23,
"keyType2[-2]": -22,
"keyType1[0]": 0,
"keyType1[2]": 2,
"keyType2[4]": -21,
"keyType1[3].subkey1": -11,
"keyType1[3].subkey2": -12,
"keyType1[4].subkey1": -21,
"keyType1[4].subkey2": -22,
"keyType1[5]": -3,
}
Обратите внимание, что второй ключ не был обработан.
Я не могу понять, в чем проблема. Есть идеи?
Комментарии:
1. Что именно вы имеете в виду
and recalculate the negative indices based on that maximum value.
? Я изучаю это, но я не понимаю, как вы получаете вывод первого example_dict, следуя приведенной выше логике.2. @AzyCrw4282 идея переназначения индексов состоит в том, чтобы в итоге получить представление индексированных ключей в виде списка, а ключи с отрицательной индексацией добавляются в конец этого списка. таким образом, независимо от порядка отрицательных индексов, вы находите наибольший индекс для этого типа ключа при каждом запуске и добавляете 1, чтобы затем этот элемент был добавлен впоследствии