普通dict(字典)在插入的時候並不記住元素的順序,迭代器會根據散列表(哈希表)中存儲的順序來生成的。而OrderedDict則會記錄元素的順序,並且在迭代器輸出時,會按現在記錄的順序進行遍歷。
例:
創建有序字典:
import collections as c
dict = c.OrderedDict()
dict['Hello'] = '你好'
dict['cute'] = '可愛'
dict['busy'] = '忙碌'
dict['just'] = '剛才'
for k,v in dict.items():
print('{0} = {1}'.format(k,v))
結果:
Hello = 你好
cute = 可愛
busy = 忙碌
just = 剛才
clear():清空有序字典,清空字典所有項。,會輸出一個OrderedDict()對象。
例:
print(dict.clear())
結果:
OrderedDict()
copy():淺拷貝
print(dict.copy())
結果:OrderedDict([('Hello', '你好'), ('cute', '可愛'), ('busy', '忙碌'), ('just', '剛才')])
pop():刪除指定的鍵,如果找不到該鍵則報錯。
例:
hello=dic.pop('Hello')
print(hello)
結果:
你好
clear()和pop()的區別:
pop():可以把有序字典看為一個棧,當需要其中某一個鍵值對的時候,可以使用pop()方法,根據鍵彈出這個值,賦給一個變量然后去使用這個值。彈出來棧里就沒有該鍵了,如果你再去訪問它就會報錯。(pop()方法差不多都是這個原理,僅限於博主接觸到的)
clear():是清空有序字典里的所有項,做了清空操作里面的鍵值對就會不存在。
items():返回有鍵值對組成的列表
例:
for k,v in dic.items():
print('{0} = {1}'.format(k,v))
結果:
Hello = 你好
cute = 可愛
busy = 忙碌
just = 剛才
當for循環里只有一個參數接收鍵值對時,它輸出的是有序字典里面的每個元素,是用括號括起來的。
例:
for k in dic.items():
print('{0}'.format(k))
結果:
('Hello', '你好')
('cute', '可愛')
('busy', '忙碌')
('just', '剛才')
淺拷貝和深拷貝的區別:
Copy():淺拷貝,淺拷貝沒有拷貝子對象,只是引用了子對象,所以改變原始數據的子對象,那淺拷貝后的數據也會被改變。可以看出,copy()方法都是淺拷貝。
例:
a=[1,2,3,4,[5,6]]
print(a)
b=a.copy()
print(b)
print('-' * 20)
a[4][0]=8
print(a)
print(b)
結果:
[1, 2, 3, 4, [5, 6]]
[1, 2, 3, 4, [5, 6]]
--------------------
[1, 2, 3, 4, [8, 6]]
[1, 2, 3, 4, [8, 6]]
首先定義一個列表a,再輸出這個a,然后再拷貝一下a並且復制給b,並輸出b,最后進行修改子對象里的第一個值修改為8,這時輸出a和b它倆的子對象同時改為8.
Deepcopy():深拷貝,他和子對象一起拷貝了一個新的,並不是引用了子對象,所以改變原始數據的子對象,那拷貝后的數據也不會被改變。深拷貝需要導入copy模塊,然后使用deepcopy()方法進行拷貝,需要給這個方法放入一個要拷貝的參數。
例:
import copy
a=[1,2,3,4,[5,6]]
print(a)
b=copy.deepcopy(a)
print(b)
print('-' * 20)
a[4][0]=8
print(a)
print(b)
結果:
[1, 2, 3, 4, [5, 6]]
[1, 2, 3, 4, [5, 6]]
--------------------
[1, 2, 3, 4, [8, 6]]
[1, 2, 3, 4, [5, 6]]
首先定義一個列表a,再輸出這個a,然后再深拷貝一下a並且復制給b,並輸出b,最后進行修改子對象里的第一個值修改為8,這時輸出a的子對象改為8,b的子對象不會變。