Как циклически сдвинуть словарь?

Есть словарь:

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 шт):

Автор решения: Stanislav Volodarskiy

Извлеките из словаря список пар (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. Обычно код опирающийся на порядок ключей в словаре - плохой код.

→ Ссылка
Автор решения: Namerek

Имхо, если речь всеже идет о каком-то гарантированном порядке следования, то я бы все-таки порекомендовал 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)])

→ Ссылка