如何在 Python 字典中反转键的顺序?

59

这是我的代码:

a = {0:'000000',1:'11111',3:'333333',4:'444444'}

for i in a:
    print i

它展示了:

0
1
3
4

但我希望它显示:

4
3
1
0

那么,我能做些什么?


8
词典没有顺序。键值似乎会按照排序的顺序输出(只是侥幸而已,并且这种实现细节不可靠)。它本身没有任何固有的顺序。 - S.Lott
请参考 @rotareti 的回答。自 Python 3.7 起,字典键具有保证的顺序(即插入顺序,而不是实际排序)。再见,无序字典键。 - NeilG
11个回答

59
注意:这个答案只适用于Python版本小于3.7。在3.7及其后续版本中,字典是按插入顺序排序的(在CPython 3.6中作为实现细节)。
键的迭代顺序是随意的。它们以排序顺序��现只是偶然的巧合。
>>> a = {0:'000000',1:'11111',3:'333333',4:'444444'}
>>> a.keys()
[0, 1, 3, 4]
>>> sorted(a.keys())
[0, 1, 3, 4]
>>> reversed(sorted(a.keys()))
<listreverseiterator object at 0x02B0DB70>
>>> list(reversed(sorted(a.keys())))
[4, 3, 1, 0]

33
你可以通过使用 sorted(a.keys(), reverse=True) 而不是使用内置的 reversed() 函数来加快反转操作的速度。 - ncoghlan

44
自从Python 3.7版本开始,字典(dict)会保留元素的顺序,这意味着现在你可以这样做:
my_dict = {'a': 1, 'c': 3, 'b': 2}

for k in reversed(list(my_dict.keys())):
    print(k)

输出:

b
c
a

自从 Python 3.8 版本开始,内置函数 reversed() 可以接受字典类型的参数。

以下是一个使用示例:

my_dict = {'a': 1, 'c': 3, 'b': 2}

for k in reversed(my_dict):
    print(k)

以下是一个示例,展示如何使用反转后的字典替换您的字典:

my_dict = dict(reversed(my_dict.items()))

2
忽略多余的 ) 会导致 SyntaxError,在 Python 3.8 中 dictviews 也只是可逆的,因此在 Python 3.7 中使用 reversed(my_dict.keys()) 将会引发 TypeError - Harmon758
@Harmon758 感谢您指出这个问题!现在答案应该已经修复了。 - Rotareti
小提示:在 reversed(list(my_dict.keys())) 中,.keys() 可以省略,因为字典迭代器返回其键。 - Hugues

20

字典是无序的,因此您无法对它们进行反转。当前输出的顺序是随意的。

话虽如此,您当然可以对键进行排序:

for i in sorted(a.keys(), reverse=True):
    print a[i];

但是这将给你排过序的键的反向顺序,而不是键被添加的反向顺序。也就是说,如果你的字典是:1 0 3,它不会给你这个结果。

a = {3:'3', 0:'0', 1:'1'}

6
供日后参考,Python 3.7及以上版本的字典实际上记住了插入顺序。(来源) - Farzad Abdolhosseini

13

试试这样做:

for i in sorted(a.keys(), reverse=True):
    print i

6

Python字典在2.x版本中不是有序的。但是在3.1版本中,有一个有序字典的实现。


1
OrderedDict 得到了 +1 的支持。实际上,在 Python 2.7 中也可以使用:http://docs.python.org/library/collections.html#collections.OrderedDict - Felix Kling

5

Python字典本身并没有任何与之相关的“顺序”。它只是一个“巧合”,使得dict打印相同的顺序。不能保证字典中的项目按任何顺序出现。

如果您想处理排序,需要将字典转换为列表。

a = list(a) # keys in list
a = a.keys() # keys in list
a = a.values() # values in list
a = a.items() # tuples of (key,value) in list

现在你可以像平常一样对列表进行排序,例如:a.sort(),也可以将其反转,例如:a.reverse()

这只会将键放入列表中,您将失去值。 - Felix Kling
2
+1 是为了解释其他答案实际上都是将其转换为列表。 - Boz

2

如果您想保留插入顺序而不是按字母顺序排序,则可以使用以下方法:

dict(list(your_dict.keys())[::-1])

或者对于整个字典:

dict(list(your_dict.items())[::-1])


2
在我使用的Python 3.6中,我使用了update函数来反转键和它们对应的值的顺序。
original_dict={'A':0,'C':2,'B':1}
new_dict={}
for k,v in original_dict.items():
    dict_element={k:v}
    dict_element.update(new_dict)
    new_dict=dict_element

print(new_dict)

它应该打印出以下内容:
{'B':1,'C':2,'A':0}

我的看法。


1
如果你有这样一个字典:
{'faisal2': 2, 'umair': 2, 'fais': 1, 'umair2': 1, 'trending': 2, 'apple': 2, 'orange': 2}

如果您想反向排序字典,可以使用以下代码:
dict(sorted(counts.items(), key=lambda item: item[1],reverse=True))

输出将是:
{'faisal2': 2, 'umair': 2, 'trending': 2, 'apple': 2, 'orange': 2, 'fais': 1, 'umair2': 1}

0
for i in reversed(sorted(a.keys())):
    print i

1
我认为这是一个“不好”的回答,因为提问者显然对Python的dict函数有误解,应该纠正这种误解,而不是给他看起来像他想要的东西。 - Chris W.
你说得对,我应该更仔细地阅读问题。 - Simon
点赞:StackExchange不是一个纠错机构。ifLoop展示了如何帮助别人而不仅仅是纠正他们的错误。 - Florian Heigl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接