日常中如何解决 Python 中字典是无序这一问题的

2021-05-14 15:22:25 +08:00
 alittlecode
collections 的 OrderedDict 可以解决无序问题,但是他是按照你赋值的顺序实现的,比如我现在有一个 dict
使用 OrderedDict 的话
from collections import OrderedDict
a = OrderedDict()
a["aaa"] = 1
a["bbb"] = 2
这样情况下得出的是一个有序的字典 dict a = {"aaa": 1, "bbb": 2}
如果我原本就有一个 dict b = {"ccc": 3, "ddd": 4}
在不遍历重新赋值的情况下怎样让成为一个有序的字典
3881 次点击
所在节点    Python
35 条回复
Jblue
2021-05-14 15:26:41 +08:00
secsilm
2021-05-14 15:30:28 +08:00
升级 Python 程序
iyaozhen
2021-05-14 15:34:23 +08:00
不遍历好像不行

话说你为啥需要有序?

而且「有序」如何定义? key 有序?按什么排序,顺序、倒序?还是按 value ?
jsutfun
2021-05-14 15:35:33 +08:00
如果按 key 的话,python3 已经是有序的了呀
allan888
2021-05-14 15:36:56 +08:00
不用别的数据结构也行:
from collections import OrderedDict

d = {"ddd": 2, "ccc": 1}
sorted_d = OrderedDict()
l = d.keys()
l.sort()
for k in l:
sorted_d[k] = d[k]
alittlecode
2021-05-14 15:39:47 +08:00
@iyaozhen 只是想让他按照我写的顺序显示比如 dict b 只是想在遍历是先出现 ccc 再出现 ddd
alittlecode
2021-05-14 15:44:31 +08:00
@allan888 不是为了排序只是为了按照我写的顺序展示根据 key 排序可以使用

my_data = {'Python': 20, 'Swift':32, 'Kotlin': 43, 'Go': 25}
# 创建基于 key 排序的 OrderedDict
d1 = OrderedDict(sorted(my_data.items(), key=lambda t: t[0]))
# 创建基于 value 排序的 OrderedDict
d2 = OrderedDict(sorted(my_data.items(), key=lambda t: t[1]))
alittlecode
2021-05-14 15:58:51 +08:00
突然想到一个问题这个除非你提前设计好这个字段是怎样的,不然你就算写好一个字典,只是 ide 让你看到是这个顺序,保存到内存就完全变了,你看到的就是个假象,只是你看到的
iyaozhen
2021-05-14 16:00:47 +08:00
你写的顺序这个计算机不好理解吧
要不用 list ?
alittlecode
2021-05-14 16:05:38 +08:00
@iyaozhen 再维护一个 list 把所有的 key 写进去
abersheeran
2021-05-14 16:49:50 +08:00
升级 Python 版本就行了。
aloxaf
2021-05-14 17:00:56 +08:00
Python 3.6 中 dict 就已经有序了
而 3.7 起 dict 保持插入顺序成为了正式的 feature
所以,你该升级 Python 了……
codists
2021-05-14 17:15:46 +08:00
没搞懂为什么那么多人说“升级 Python”或者“Python3.6 就已经有序了“,这个有序说的是插入的有序。而提问者的问题是”键按字母顺序排序或者按值排序“吧?
aloxaf
2021-05-14 17:21:45 +08:00
@codists #13 提问者在 6 楼和 7 楼都说了,「只是想让他按照我写的顺序显示」,「不是为了排序只是为了按照我写的顺序展示」
llsquaer
2021-05-14 17:23:26 +08:00
dict 现在已经有序了..但是有一次我发现 , 用 pyqt 发信号传 dict 数据..,还是出现了无序的问题..解决的方法是,转为元组,然后再 zip() 转为 dict
chaleaoch
2021-05-14 17:26:39 +08:00
python3. 6 7 8 忘记是哪个版本 已经开始有序
另外 OrderedDict 考虑一下.
chaleaoch
2021-05-14 17:27:29 +08:00
楼主忽略 我没看正文.
ch2
2021-05-14 17:28:40 +08:00
字典本来就是不保证有序的
weyou
2021-05-14 17:30:57 +08:00
二楼已经给出方面答案了啊,要按照写的顺序就是升到 3.6
xylophone21
2021-05-14 17:36:54 +08:00
HashMap 是“无序”的,它的“序”靠的是 Hash 值,如果要“有序”可以用红黑树之类结构,但代价是你只能用你排序的那个字段做快速查找、插入了。

如果即需要用 Key 快速查找、插入,又希望用别的参数来做“序”那么可能你需要一个符合的数据结构。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/776937

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX