日常中如何解决 Python 中字典是无序这一问题的 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
alittlecode

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

  •  
  •   alittlecode May 14, 2021 4756 views
    This topic created in 1812 days ago, the information mentioned may be changed or developed.
    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}
    在不遍历重新赋值的情况下怎样让成为一个有序的字典
    35 replies    2021-05-19 14:12:36 +08:00
    Jblue
        1
    Jblue  
       May 14, 2021
    secsilm
        2
    secsilm  
       May 14, 2021 via Android   5
    升级 Python 程序
    iyaozhen
        3
    iyaozhen  
       May 14, 2021
    不遍历好像不行

    话说你为啥需要有序?

    而且「有序」如何定义? key 有序?按什么排序,顺序、倒序?还是按 value ?
    jsutfun
        4
    jsutfun  
       May 14, 2021
    如果按 key 的话,python3 已经是有序的了呀
    allan888
        5
    allan888  
       May 14, 2021
    不用别的数据结构也行:
    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
        6
    alittlecode  
    OP
       May 14, 2021
    @iyaozhen 只是想让他按照我写的顺序显示比如 dict b 只是想在遍历是先出现 ccc 再出现 ddd
    alittlecode
        7
    alittlecode  
    OP
       May 14, 2021
    @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
        8
    alittlecode  
    OP
       May 14, 2021
    突然想到一个问题这个除非你提前设计好这个字段是怎样的,不然你就算写好一个字典,只是 ide 让你看到是这个顺序,保存到内存就完全变了,你看到的就是个假象,只是你看到的
    iyaozhen
        9
    iyaozhen  
       May 14, 2021 via Android
    你写的顺序这个计算机不好理解吧
    要不用 list ?
    alittlecode
        10
    alittlecode  
    OP
       May 14, 2021
    @iyaozhen 再维护一个 list 把所有的 key 写进去
    abersheeran
        11
    abersheeran  
       May 14, 2021
    升级 Python 版本就行了。
    aloxaf
        12
    aloxaf  
       May 14, 2021   1
    Python 3.6 中 dict 就已经有序了
    而 3.7 起 dict 保持插入顺序成为了正式的 feature
    所以,你该升级 Python 了……
    codists
        13
    codists  
       May 14, 2021
    没搞懂为什么那么多人说“升级 Python”或者“Python3.6 就已经有序了“,这个有序说的是插入的有序。而提问者的问题是”键按字母顺序排序或者按值排序“吧?
    aloxaf
        14
    aloxaf  
       May 14, 2021
    @codists #13 提问者在 6 楼和 7 楼都说了,「只是想让他按照我写的顺序显示」,「不是为了排序只是为了按照我写的顺序展示」
    llsquaer
        15
    llsquaer  
       May 14, 2021
    dict 现在已经有序了..但是有一次我发现 , 用 pyqt 发信号传 dict 数据..,还是出现了无序的问题..解决的方法是,转为元组,然后再 zip() 转为 dict
    chaleaoch
        16
    chaleaoch  
       May 14, 2021
    python3. 6 7 8 忘记是哪个版本 已经开始有序
    另外 OrderedDict 考虑一下.
    chaleaoch
        17
    chaleaoch  
       May 14, 2021
    楼主忽略 我没看正文.
    ch2
        18
    ch2  
       May 14, 2021
    字典本来就是不保证有序的
    weyou
        19
    weyou  
       May 14, 2021 via Android
    二楼已经给出方面答案了啊,要按照写的顺序就是升到 3.6
    xylophone21
        20
    xylophone21  
       May 14, 2021
    HashMap 是“无序”的,它的“序”靠的是 Hash 值,如果要“有序”可以用红黑树之类结构,但代价是你只能用你排序的那个字段做快速查找、插入了。

    如果即需要用 Key 快速查找、插入,又希望用别的参数来做“序”那么可能你需要一个符合的数据结构。
    Trim21
        21
    Trim21  
       May 14, 2021 via Android
    @ch2 dict 现在保证是有序的
    BBCCBB
        22
    BBCCBB  
       May 14, 2021
    @Trim21 保证有序也不对.. python3.5 还是 3.6+. 只是恰好实现的 dict 是有序的, 官方好像说不要依赖这个特性?? 因为他们不保证后续依然有序.
    Trim21
        23
    Trim21  
       May 14, 2021 via Android
    @BBCCBB
    3.6cpython 的实现是有序的

    然后 3.7 加入了语言特性
    renmu123
        24
    renmu123  
       May 14, 2021 via Android
    @BBCCBB 我记得后续的一个大版本已经确定这个 feature 了。
    你可以用[{}]进行遍历
    Trim21
        25
    Trim21  
       May 14, 2021 via Android
    我突然明白楼主的问题了,楼主说的是 dict 字面量的排序问题吧,这个好像没有保证过是有序的,保证的都是分别设置 key 的顺序。
    Trim21
        26
    Trim21  
       May 14, 2021 via Android
    应该只能 OrderedDict([(key,value),])这样了
    BBCCBB
        27
    BBCCBB  
       May 14, 2021
    @Trim21
    @renmu123
    学到了.. 要是有个链接更好了. 不是专业 python 搜这个有点恼火
    Trim21
        28
    Trim21  
       May 14, 2021 via Android
    @BBCCBB 是 guido 在邮件列表里说的…没有个 pep
    renmu123
        29
    renmu123  
       May 14, 2021
    https://docs.python.org/zh-cn/3/library/stdtypes.html#mapping-types-dict

    在 3.7 版更改: 字典顺序会确保为插入顺序。 此行为是自 3.6 版开始的 CPython 实现细节。
    seeleling
        30
    seeleling  
       May 14, 2021
    升级 Python
    francis59
        31
    francis59  
       May 14, 2021
    cherbim
        32
    cherbim  
       May 15, 2021 via iPhone
    不好意思,我的 Python 字典是有序的
    BBCCBB
        33
    BBCCBB  
       May 15, 2021
    @Trim21
    @renmu123
    那 OrderedDict 这个类在新版本里除了兼容老代码. 基本就没啥用了哈
    renmu123
        34
    renmu123  
       May 15, 2021
    @BBCCBB 还可以用来对字典顺序排序
    no1xsyzy
        35
    no1xsyzy  
       May 19, 2021
    @BBCCBB OrderedDict 可以手动调序,但操作极复杂,不推荐。
    About     Help     Advertise     Blog     API     FAQ     Solana     839 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 140ms UTC 20:03 PVG 04:03 LAX 13:03 JFK 16:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86