Следующий код будет работать так же хорошо с любым размером набора ключей (2, 5, 87 и т. Д.)
Нет простого способа переименовать ключ словаря, но вы можете вставить новый ключ и удалить старый. Это не рекомендуется по нескольким причинам:
, чтобы быть в безопасности, вам нужно проверить, чтобы убедиться, что вы не делаете что-то странное, например, создание нового ключа только для удаления того же ключа
будьте осторожны, когда вы перебираете словарь при его изменении
Если вам нужен результат словаря, самое безопасное - создать совершенно новый словарь на основе a
, как это было сделано здесь.
Проблема, которую вы пытаетесь решить, легче перенести в словарь.
После вычисления нового ключа (8, 9): [[0, 0], [4, 5]]
должно стать:
(8 - sum([0, 4]), 9 - sum([0, 5])): [[0, 0], [4, 5]]
Теперь посмотрим, как помогает транспонирование:
transposed([[0, 0], [4, 5]]) == [[0, 4], [0, 5]]
, тогда новый key[0]
расчет:
key[0] - sum(transposed(values)[0])
и новый key[1]
расчет:
key[1] - sum(transposed(values)[1])
Таким образом, транспонирование облегчает вычисления.
Словари Python не могут иметь списки в качестве ключей (списки не могут быть хэшируемыми ), поэтому я собрал ключ в виде списка, а затем преобразовал его в кортеж в конце.
a = {
(8, 9): [[0, 0], [4, 5]],
(3, 4): [[1, 2], [6, 7]]
}
def transpose(m):
return list(zip(*m))
results = {}
for source_keys, source_values in a.items():
transposed_values = transpose(source_values)
key = []
for n, key_item in enumerate(source_keys):
subtractables = sum(transposed_values[n])
key.append(key_item - subtractables)
results[tuple(key)] = source_values
print(results)
>>> python transpose.py
{(4, 4): [[0, 0], [4, 5]], (-4, -5): [[1, 2], [6, 7]]}