在字典中交换项目及其顺序

1 投票
5 回答
5105 浏览
提问于 2025-04-17 07:40

我正在尝试把一个字典里的键和值互换。通过查看之前的问题,我知道可以用一些方法来交换字典里的键和值,比如:

newdict = dict((b,a) for a,b in D.items())

我也知道字典是无序的,所以如果字典很长,新的字典里的每对键值对的位置可能和原来的字典不一样。

所以我的问题是,有没有办法先交换第一对键值对,然后把它们按顺序放到一个列表里,再添加到一个新的字典中?接着再对第二对进行同样的操作,依此类推?这可能听起来有点傻,但我就是不太明白这个过程,任何帮助我都会非常感激。:)

为了更清楚,这里是我当前代码的功能:

D = {1:2, 3:4, 5:6, 8:9, 20:11} #this is the input

{9: 8, 2: 1, 11: 20, 4: 3, 6: 5} #this is the output

我希望输出结果是:

{2:1, 4:3, 6:5, 9:8, 11:20}

作为参考,我的代码其实很简单:

def invert():
    newdict = list((b,a) for a,b in D.items())

D = {1:2, 3:4, 5:6, 8:9, 20:11}

invert()

5 个回答

0

你不能保证在任何字典中排序的顺序会被保持。

如果你想要一个可以按顺序遍历值的结构,我建议你使用一个元组的列表:

D = [(1,2), (3,4), (5,6), (8,9), (20,11)]

要反转它:

Di = [(x,y) for (y,x) in D]

然后得到一个你可以查找的字典:

DictD = dict(D)
DictDi = dict(Di)
1

你真的应该使用 OrderedDict 来实现这个功能。你的字典输入的顺序和它在内部存储的方式是没有关系的。

3

OrderedDict作为解决方案的一部分

正如你提到的,dict没有特定的顺序,所以你需要实现一个类似于dict的数据结构,但它可以保持顺序。

一个好的解决方案是 OrderedDict。你可以这样创建一个有序的OrderedDict

>>> D = {9: 8, 2: 1, 11: 20, 4: 3, 6: 5}
>>> import collections
>>> E = collections.OrderedDict((i, D[i]) for i in sorted(D))
>>> E
OrderedDict([(2, 1), (4, 3), (6, 5), (9, 8), (11, 20)])

使用 OrderedDict 反转字典

你的整个解决方案可能看起来像这样:

>>> D = {9: 8, 2: 1, 11: 20, 4: 3, 6: 5}
>>> def invert(D):
    import collections
    return collections.OrderedDict((D[i], i) for i in sorted(D))

>>> invert(D)
OrderedDict([(1, 2), (3, 4), (5, 6), (8, 9), (20, 11)])

这样可以吗?

在Python 2.7之前的版本中的支持

OrderedDict在Python 2.x版本中从2.7开始提供,在Python 3.x版本中从3.1开始提供,但在旧版本中也可以很容易地实现。如果你需要在旧版本中使用它,可以查看这个问题(“旧版本Python的OrderedDict”)和答案

撰写回答