如何改变字典中键值对的顺序?

3
如何将最后一个键值对移动到第一个位置?
d = {1 : 'a', 2 : 'b', 3 : 'c'}

这是我想要的内容。
d = {3 : 'c', 1 : 'a', 2 : 'b'}

我不知道如何实现它。


4
你为什么想要它?字典的美妙之处在于顺序并不重要... - Kaiyakha
除非你使用 OrderedDict,它只保留插入顺序,否则在 Python 中字典条目没有隐含的顺序。如果你关心这一点,就使用列表代替。 - TheDude
7
实际上是有的。自从 Python 3.7 开始,字典的插入顺序被保证会得到维护。 - S.B
@Kaiyakha:我们通常希望对json dumps进行此操作,因为json包根据键-值对的顺序在字典中打印它们,这通常(但不一定是理想的)是插入顺序。 - ReubenBeeler
3个回答

3

一种方法是:

d = {1: "a", 2: "b", 3: "c"}
print(dict([d.popitem()]) | d)

输出

{3: 'c', 1: 'a', 2: 'b'}
popitem()函数返回字典中最后一个键值对的元组。将其放入列表中创建可迭代的键值对项目,然后可以在其上调用dict()函数。
根据文档

...否则,位置参数必须是一个可迭代对象。可迭代中的每个项本身必须是一个包含两个对象的可迭代对象。每个条目的第一个对象成为新字典中的键,第二个对象成为相应的值。

此方法适用于版本3.9及以上。自版本3.7以来,字典的插入顺序得到保留。自版本3.9开始,字典支持联合|运算符。

1
{**dict([d.popitem()]), **d} 对于 Python <3.9 的版本。 - Michael Szczesny
@MichaelSzczesny 对的。此外,就地执行的.update()方法也可以起作用。 - S.B

1

对于系统性的方法,在 dict 很大的情况下,您可以使用一个包含旧键-新键列表的映射器,然后使用字典推导式获取具有新顺序的字典。

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

mapper = [(1, 3), (2, 1), (3, 2)]

new_d = {k_new: d[k_new] for _, k_new in mapper}

1

仅当你使用保持插入顺序的Python版本(Python 3.7及更高版本)时,它才有效,但你可以尝试:

d = {1 : 'a', 2 : 'b', 3 : 'c'}
# last key
last_k = next(reversed(d))
# put the last key-value pair before the rest
d = {last_k: d.pop(last_k), **d}
d
# {3: 'c', 1: 'a', 2: 'b'}

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