如何重新排列字典键的顺序?

5
我遇到了一个问题,我想重新排列字典键的顺序。我有一个数组,其中有 env = [key1, key2, key3],然后在循环中这些键从数组中获取,并被传递给字典 dict_result。尽管我没有使用任何排序函数,但字典 dict_result 根据 key1、key2和key3的名称的字母顺序显示了这些 env 键的顺序,格式如下:
{'name': {'key2': [val1, val2, val3], 'key1': [], 'key3': [val1, val2]},
'name1': {'key2': [val1, val2, val3], 'key1': [], 'key3': [val1, val2]},
...
}

for k in dict_result['name'].keys():
    //performing checks 


我想要改变dict_result[name]嵌套键的顺序,使其看起来像这样:
{'name': {'key3': [val1, val2]}, 'key2': [],'key1': [val1, val2, val3]}

我尝试了使用内置函数reversed(),但它似乎创建了一个迭代器,这改变了我现有代码中的某些逻辑,以及正在遍历这些字典环境键并根据其值执行检查/验证的for循环。

我现在明白了,普通的字典不会跟踪插入顺序,并且对其进行迭代会以任意顺序给出值。

如果有更简单的方法可以按照从数组中输入的顺序,即key1、key2、key3来让字典使用这些env keys,或者将其反转为key3、key2、key1,请帮忙指导。但是不想按照实际键名按字母顺序显示。


3
你想按字母顺序对这些键进行排序吗?请记住(根据你使用的 Python 版本),字典在 Python 3.6 之前是无序的,在 Python 3.6 及之后则保留了插入的顺序。 - lmiguelvargasf
@lmiguelvargasf 在 Python 3.6 之前,字典是无序的,而在 Python 3.6 之后,插入顺序被保留。我不太理解这个,请您详细说明一下。 - Narendra Lucky
@NarendraLucky,在Python 3.6之前,字典中元素的顺序是不相关的,我指的是插入顺序。您可以在此链接中了解更多信息。此外,在Python 3.6中,插入顺序并不能完全保证,直到Python 3.7才能依赖此功能 - lmiguelvargasf
我在缩小问题后更新了描述,这有帮助吗? - anonymous-explorer
5个回答

2

OrderedDict 可以用来维护插入顺序,一旦对键进行排序。

最初的回答:使用OrderedDict可以保持插入顺序,前提是对键进行了排序。
import collections

data = {'name': {'key3': [1, 2, 3], 'key2': [], 'key1': [5, 6]}}
data['name'] = sorted(data['name'].items())
order_dict = collections.OrderedDict(data)
print(order_dict)

O/P:

OrderedDict([('name', [('key1', [5, 6]), ('key2', []), ('key3', [1, 2, 3])])])

使用OrderedDict对我很有用。但是我不必使用sorted。这是我所做的:import collections dict_result['name']= collections.OrderedDict() - anonymous-explorer

1
一行代码的字典推导式:
print({k: dict(zip(list(v.keys())[::-1], list(v.values())[::-1])) for k, v in dict_result.items()})

这适用于任意数量的键。


0

我认为你可以更新这个特定的字典:

dict_result['name'] = {key: dict_result['names'][key] for key in sorted(dict_result['name'].keys())}

1
@U10-Forward,你说得很好。实际上,我只关注了这个特定的情况,因为提问者没有提到它。顺便说一句,我喜欢你的回答,但我觉得对于新手来说可能有点难以理解。 - lmiguelvargasf
是的,没错,我正在尝试制作我能想到的最短的解决方案。 - U13-Forward

0
可能的解决方案:
from collections import OrderedDict
my_dictionary=OrderedDict()
for i in (old_dict.keys()):
    my_dictionary[i]=b[i]

0
通过使用reversed()关键字,您可以获得您的结果:
val1,val2,val3 = 1,2,3
dict_result = {'name': {'key3': [val1, val2, val3], 'key2': [], 'key1': 
 [val1, val2]}}
old_key = dict_result['name'].keys()
old_key = list(old_key)
new_key = list(reversed(old_key))
#print(new_key)
value = []
for k in new_key:
    value.append(dict_result['name'][k])
zip_key_value = list ( zip(new_key, value) )
temp_dict = dict(zip_key_value)
new_dict_result = {'name':temp_dict}

print(dict_result)
print(new_dict_result)

输出

{'name': {'key3': [1, 2, 3], 'key2': [], 'key1': [1, 2]}}
{'name': {'key1': [1, 2], 'key2': [], 'key3': [1, 2, 3]}}

希望对你有所帮助。


谢谢@rahul-charan,我已经尝试过了,但似乎我必须改变我的其余代码逻辑,因为reversed()将'name'的键转换为迭代器,不确定key1、key2、key3键的各个值会发生什么。现在如何访问key1的值?新字典变成dict_result = {'name': <listreverseiterator object at 0x10c3f7fd0>}。当在reversed()之后打印时,list(dic_result[app])确实将键反转为[key1,key2,key3]。 - anonymous-explorer
@anonymous-explorer 我想我明白你的意思了,我已经修改了我的代码,请看看,也许能帮到你。 - Rahul charan

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