【问题标题】:Rearrange dictionary so that value is the next key重新排列字典,使值成为下一个键
【发布时间】:2020-05-25 20:07:57
【问题描述】:

我有一本字典如下:

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

我想重新排列它,使当前对的值是下对的键,像这样:

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

我该如何处理?

【问题讨论】:

标签: python python-3.x sorting dictionary key


【解决方案1】:

您可以使用 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}

【讨论】:

  • {k:d[k] for k in accumulate(d,d.get)} 也可以。
【解决方案2】:

这可以使用以下代码 - 从 Python 3.7(CPython 的 Python 3.6)开始的字典按插入排序,因此我们从 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]

根据下面的 cmets,如果键/值包含循环,我们希望移动到下一个键值对。这可以通过以下方式实现:

代码:

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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多