1樓:Tux ZZ
補充 @靈劍 的回答。
cpython3.6的dict實現搬了pypy的實現,是保持順序的。
** 但你依然不能把dict當作有序的來使用 **因為dict的標準規定*不保證*有順序,要保證有順序的請用OrderedDict
2樓:七月
字典是無序的,這句話是對的。但是字典的儲存過程卻是按順序的。
字典的儲存背後的邏輯是雜湊表,也就是稀疏陣列。dict初始化之後,Python直譯器會給dict分配一定的空間,往字典裡新增是按順序新增的。
但是,如果如果繼續往字典裡新增新鍵,有可能會引起Python直譯器對儲存空間的擴容,擴容的過程會新建雜湊表,然後複製已有的元素到新雜湊表,這個過程可能會引起雜湊衝突,導致dict的鍵值對的次序發生變化。
《流暢的Python》一書有關於字典的儲存更為詳細的介紹。
如果不了解雜湊表,可以查資料。
3樓:李強
Python內部對key的索引是有序的,具體我舉個例子.
In [6]: hash("acc")&7Out[6]: 2
In [7]: hash("abc")&7Out[7]: 4
In [8]:
Out[8]:
輸入字典順序是先key"acc"後key"abc",輸出位置就倒了.
當然除了整數hash("key")&7的值好像每次重新開乙個Python直譯器都會變.所以說可能你的hash("abc")&7這個值也會和我的不一樣.
回到你的問題.
In [9]: hash('Wang')&7Out[9]: 1
In [10]: hash('Li')&7Out[10]: 1
In [11]: hash('Ma')&7Out[11]: 5
In [12]:
Out[12]:
我現在的字典順序就變了呢.
但是實際上這個返回順序並不重要.
4樓:PegasusWang
Python dictionary implementation
你看下 dict 的 CPython hash 實現就了解了
5樓:靈劍
無序的不代表隨機的,也不代表每次都是隨機的,這些詞有細微的差異。無序的只是說,你不該對順序有任何假定,既不能假定有確定順序,也不能假定沒有確定順序。
6樓:Scavenger
沒有順序,包括.keys取鍵,.values取值,字典無序儲存不是逗你玩的,不管你在命令列裡輸出多少次一樣的順序都不要上當!!!
如果要取字典順序,請你老老實實用ordereddict!!
這是我有一次在spark做需求的血淚教訓
7樓:Revive
一般語言裡的dict結構只是表面上說自己是無序的,實際上根據內部實現會有自己的一套順序,只是這個順序可能比較古怪,比較混沌,比較沒有統一標準,甚至可能以後實現變了順序也會變,所以設計者也不想告訴你究竟是個什麼順序,但是每次讀出來都會根據這個順序出。
不過也有比較奇葩的語言每次讀出來的順序都不一樣,比如說golang。
8樓:Coldwings
如果按照語言規範來看,Python的規範裡沒有說明Dict是乙個有序的型別。換句話說,dict就是無序的,因為語言規範不保證它按照什麼順序出來。要有序,請使用OrderedDict。
但是無序不是說每次輸出結果都不同,無序只是指結果不保證一定與插入順序一致而已。
CPython 3.6裡對dict有個新的實現,使得字典內部儲存的順序不僅僅與key有關,還與插入順序有關。但是有關並不代表它就一定按照插入順序依次出現(似乎當字典實現在記憶體中進行擴充套件的時候就可能造成結果不一致),只不過表示如果key相同,插入順序相同,那麼結果也是相同的。
在此之前,用values和keys方法取到的list僅與key(準確的說是key的__hash__)有關而與插入順序無關。
Python的字典和資料庫有什麼區別?字典能用來儲存大量資料並供隨時查詢呼叫嗎?
那些年 樓上基本都是正解 1.字典的資料在記憶體裡,python程式執行時字典的資料一直存在,但是程式不執行之後,字典內的資料馬上就會被清除。資料庫是持久化的資料,存在硬碟裡,你只要資料寫進去,無論你python程式執行不執行,資料都不會丟失。2.可以用來儲存,但沒必要,用資料庫儲存明顯是個更好的選...
python爬蟲爬到一些類似字典的資料,但是有的key是純數字,怎樣把數字轉成字串?
Interlock import json source 402 result json loads json dumps source print result 402 Obsession 你就是想把字典的鍵都轉化為字串吧,python字典的鍵是hash,不能直接修改,但可以新建字典,遍歷新增元素...
python中字典如何找出最值,以及找到最值後返回對應的key
2gua 來乙個,比較靈活的 from functools import reduce data def refn acc elem key lst elem fork,v inlst if k acc fname return acc ifacc val velse return accdef m...