Как обрабатывать ключи словаря Python в цикле for с одновременным добавлением новых ключей

#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, чтобы затем этот элемент был добавлен впоследствии