Ⅰ python中的OrderedDict與dict:適合工作的工具--第二篇
Python入門 OrderedDict
OrderedDict 是 Python 中的一個字典子類,它保留了鍵值對插入的順序。在進行迭代時,會按照原始順序遍歷所有項目。如果更新現有鍵的值,順序保持不變;如果刪除項目並重新插入,則該項目將添加到字典末尾。
作為字典子類,OrderedDict 繼承了常規字典的所有方法。此外,它還具有其他功能,將在後續教程中介紹。在此節中,將學習如何在代碼中創建和使用有序字典。
創建有序字典對象
創建有序字典對象的第一步是從 collections 模塊導入類。有幾種創建有序字典的方法,與創建常規字典對象的方式相似。例如,可以通過實例化不帶參數的類來創建一個空的對象:
創建一個空的有序字典,無需向構造函數提供參數。
通過在方括弧([])中提供鍵並將值分配給該鍵,可以將鍵值對添加到字典中。引用時,將獲得一個迭代的鍵值對,這些鍵值對按插入到字典中的順序保存項目。
還可以將項目的可迭代項作為參數傳遞給構造函數:
當使用序列時,所得有序字典中各項的順序與輸入序列中各項的原始順序匹配。如果使用列表、元組或集合,則創建之前項的最終順序是未知的。
如果您使用常規字典作為有序字典對象的初始化程序,並且使用的是 Python 3.6 或更高版本,則會遵循以下行為:
有序字典中的項目順序與原始字典中的順序匹配。另一方面,如果使用的 Python 版本低於 3.6,則項目順序是未知的。
從 Python 3.6 開始,函數保留調用中傳遞的關鍵字參數的順序。因此,有序字典中各項的順序與將關鍵字參數傳遞給構造函數的順序匹配。在早期版本中,該順序是未知的。
最後,有序字典還提供了 fromkeys() 方法,可以從可迭代的鍵創建一個新的字典,並將所有值設置為一個公共值:
使用鍵列表作為起點創建有序字典。第二個參數提供單個值給字典中的所有項目。
管理物品有序字典
由於有序字典是可變數據結構,因此可以對其實例執行變異操作。可以插入新項目、更新和刪除現有項目等。如果將新項目插入現有的有序字典中,則項目將添加到詞典末尾。
刪除一個項目並插入同一項目的新實例,則新項目將添加到基礎詞典的末尾。
重新分配或更新有序字典對象中現有鍵值對的值,則鍵將保持其位置但會獲得新值。同樣,如果使用 .update() 方法修改現有鍵值對的值,則字典會記住鍵的位置並為其分配更新後的值。
遍歷有序字典
就像一般的字典一樣,可以使用多種工具和技術迭代有序字典的對象。可以直接按鍵迭代,或者使用字典的方法,如 .items()、.keys() 和 .values():
第一個 for 循環直接遍歷鍵的鍵。其他三個循環使用字典方法遍歷的項目、鍵和值。
以相反的順序迭代 reversed()
自 Python 3.5 以來,有序字典支持使用 reversed() 進行反向迭代。此功能已添加到 Python 3.8 的常規字典中。因此,如果代碼使用它,則後向兼容性受到常規字典的更多限制。
可以使用 reversed() 對有序字典的項目、鍵和值進行反向迭代:
本示例中的每個循環都用於 reversed() 以相反的順序遍歷有序字典的不同元素。
常規字典還支持反向迭代。但在低於 3.8 的 Python 版本中嘗試使用常規 dict 對象的 reversed() 會得到 TypeError:
如果需要以相反的順序遍歷字典中的項目,那麼有序字典是一個很好的選擇。使用常規字典會降低後向兼容性,因為直到 Python 3.8 才將反向迭代添加到常規字典中。
Ⅱ Python中list,tuple,dict,set的區別和用法
python中list,tuple,dict,set是最常用的集合類型。
list列表,相當於一個數組,不過list的長度是自動變化的而且列表元素自由的,不必每個元素都是同一種類型。它的簡潔的定義方式是a=[]。有序組合
tuple也是一個組合。不過tuple在定義好之後就不能再變化。它的簡潔的定義方式是a=1,3也可以是a=(1,3).有序組合。
dict是字典類型。也就是鍵值對類型。鍵名不可以重復,並且不可以變化(字元串就符合這個要求,常用字元串作為鍵名)。它的簡潔的定義方式是a={}.無序組合(意思就是你無法按照添加的順序對他進行遍歷)。
set是set類型(不好翻譯,用的也少)。也是一個無序的組合,元素是互斥的,也就不會出現相同的元素。可以把一個序列轉換成無重復元素的set.無序組合。
以下是使用的示例代碼。
a_tuple=(1,3423,'34')
a_list=[12,12.34,'sds']
a_dict={'key1':1,'key2':2}
a_set=set('2323')
fortina_tuple:
print('%sintuple'%t)
print('*'*10)
forlina_list:
print('%sinlist'%l)
print('*'*10)
fork,vina_dict.items():
print('key=%s,value=%sindict'%(k,v))
print('*'*10)
forsina_set:
print('%sinset'%s)
print('*'*10)
不明白可追問。
Ⅲ python字典是否有序
默認情況下Python的字典輸出順序是按照鍵的創建順序。
字典的無序是指,不能人為重新排序。
比如說你按鍵值1,2,3,4的順序創建的字典,只能由解析器按創建順序,還是1,2,3,4的輸出。
你無法控制它按照4,3,2,1的順序輸出,你也無法做到1,3,2,4的順序。
而且這個輸出順序是也不是能真正按照創建順序可以控的。
這裡面有兩個影響因素:
(1)鍵值的哈希碰撞,hash(key1) == hash(key2)時,向字典里連續添加的這個兩個鍵的順序是不可以控制的,也是無法做到連續的,後來的鍵會按演算法調整到其它位置。
(2)字典空間擴容,當鍵的數量超過字典默認開的空間時,字典會做空間擴容,擴容後的鍵順和創建順序就會發生變化,不受人為控制。