Переставить словарь так, чтобы значение было следующим ключом - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть следующий словарь:

{1: 3, 2: 4, 3: 5, 4: 1, 5: 2}

Я хотел бы изменить его так, чтобы значение текущей пары было ключом следующей пары, например:

{1: 3, 3: 5, 5: 2, 2: 4, 4: 1}

Как я могу подойти к этому?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Вы можете сделать это, используя метод накапливания из itertools:

d = {1: 3, 2: 4, 3: 5, 4: 1, 5: 2}

from itertools import accumulate
od = {k:d[k] for k in accumulate(d,lambda k,_:d[k]) }

#od : {1: 3, 3: 5, 5: 2, 2: 4, 4: 1}
2 голосов
/ 10 февраля 2020

Это возможно, используя следующий код - словари с Python 3.7 (Python 3.6 для CPython) упорядочены путем вставки, поэтому мы начинаем с первого ключа из d и выполняйте итерацию, обновляя следующий ключ для проверки, используя значение из последнего ключа, пока длина нашего нового словаря не станет такой же, как у нашего старого словаря.

Код:

d = {1: 3, 2: 4, 3: 5, 4: 1, 5: 2}

curr = list(d.keys())[0]

d_new = {}

while len(d) > len(d_new):
    d_new[curr] = curr = d[curr]

Выход:

>>> d_new
{1: 3, 3: 5, 5: 2, 2: 4, 4: 1}

Ниже Python 3.7, вы можете использовать OrderedDict :

from collections import OrderedDict

d = {1: 3, 2: 4, 3: 5, 4: 1, 5: 2}

curr = 1

d_new = OrderedDict()

while len(d) > len(d_new):
    d_new[curr] = curr = d[curr]

Согласно комментариям ниже, если ключ / значения содержат al oop, мы хотим перейти к следующей паре ключ-значение. Это может быть достигнуто следующим образом:

Код:

d = {1: 3, 2: 4, 3: 1, 4: 1, 5: 2}

curr = list(d.keys())[0]

d_new = {}

while len(d) > len(d_new):
    if curr not in d_new:
        d_new[curr] = curr = d[curr]
    else:
        curr = next(x for x in d.keys() if x not in d_new)

Выход:

>>> d_new
{1: 3, 3: 1, 2: 4, 4: 1, 5: 2}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...