我正在尝试获取键和值的字典,然后交换相应的键和值,从查看以前发布的问题我知道你可以使用以下内容交换字典的键/值:
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()
答案 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)])
它对你有用吗?
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}
>>>