在字典中交换项目及其顺序
我正在尝试把一个字典里的键和值互换。通过查看之前的问题,我知道可以用一些方法来交换字典里的键和值,比如:
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”)和答案。