交换字典和订单中的项目

时间:2011-12-04 19:30:50

标签: python dictionary swap

我正在尝试获取键和值的字典,然后交换相应的键和值,从查看以前发布的问题我知道你可以使用以下内容交换字典的键/值:

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 :(得分: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)])

它对你有用吗?

支持早于2.7的Python

OrderedDict自2.7版开始在Python 2.x行中可用,自3.1以来在Python 3.x行中可用,但它可以在旧版本中轻松实现。如果您在旧版本中需要它,请参阅this question ("OrderedDict for older versions of Python") and answers

答案 1 :(得分:1)

您真的想使用OrderedDicts来实现这一目标。字典的输入顺序与内部存储方式无关。

答案 2 :(得分: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)

答案 3 :(得分:0)

没有内置函数来重新排序字典。如果由于任何原因你想要一个有序的字典,你应该在你的字典旁边保留一个帮助列表。在以下代码列表中,order用于保持项目的顺序。每当你想迭代你的字典时,实际上迭代order并使用它的项来索引字典。

def invert():
    order = [b for a,b in D.items()]
    newdict = dict((b,a) for a,b in D.items())
    return order

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

order = invert()

#This will print out the values in the order you want:
for i in order:
    print(newdict[i])

话虽如此,我甚至不确定(b,a) for a,b in D.items()是否返回当前字典顺序中的项目。所以即使在invert函数而不是:

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

你可能想写:

#Think the initial order is saved in initial_order
newdict = dict((D[a],a) for a in initial_order)

另一种方法是使用包含(索引,值)对的列表结构。我想解释一下,但@Joe已经这样做了。

答案 4 :(得分:0)

因为没有安排地图,所以你想要做的事情是不可能的:

  

我理想情况下输出为:   {2:1,4:3,6:5,9:8,11:20}

e.g。如果您使用{2:1,4:3,6:5,9:8,11:20}创建地图并打印出来,您将看到订单将丢失。

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