Collections — OrderedDict類

笨鳥丶丶發表於2019-01-29

普通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的子物件不會變。

相關文章