Как циклически сдвинуть словарь?
Есть словарь:
dict1 = {"a": 1,
"b": 2,
"c": 3,
"d": 4,
"f": 5}
Выбирается какой-то произвольный ключ из словаря dict1 и ставится в начало нового словаря. После этого элементы идут в такой же последовательности дальше. Когда доходят до конца, то дальше следуют элементы из самого начала, вплоть до выбранного произвольного ключа.
Немного запутанно, но на примере все очень понятно. Из словаря:
dict1 = {"a": 1,
"b": 2,
"c": 3,
"d": 4,
"f": 5}
Берем произвольный ключ, например ключ "c". Получается следующий словарь dict2:
dict2 = {"c": 3,
"d": 4,
"f": 5,
"a": 1,
"b": 2}
Т.е. мы дошли до ключа "f", а потом когда словарь закончился мы вставили ключи "a" и "b" в конец, которые стояли до ключа "c".
Ответы (2 шт):
Извлеките из словаря список пар (key, value), отыщите в нём нужную пару, "проверните" список пар, составьте новый словарь:
def rotate_dict(d, key):
items = tuple(d.items())
i = items.index((key, d[key]))
return dict(items[i:] + items[:i])
dict1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'f': 5}
print(dict1)
print(rotate_dict(dict1, 'c'))
$ python rotate_dict.py {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'f': 5} {'c': 3, 'd': 4, 'f': 5, 'a': 1, 'b': 2}
P.S. Обычно код опирающийся на порядок ключей в словаре - плохой код.
Имхо, если речь всеже идет о каком-то гарантированном порядке следования, то я бы все-таки порекомендовал OrderedDict
from collections import OrderedDict
from random import choice
od1 = OrderedDict(
[
('a', 1),
('b', 2),
('c', 3),
('d', 4),
('f', 5)
]
)
# top_key = choice(list(od1.keys()))
top_key = 'c'
for key in od1.copy():
if key != top_key:
od1.move_to_end(key)
continue
break
print(
od1
)
# OrderedDict([('c', 3), ('d', 4), ('f', 5), ('a', 1), ('b', 2)])