list
list是可變有序元素集合,通過方括號定義,例如:
list_t=[0,1,2,3,4]
>>> list_t
[0, 1, 2, 3, 4]
>>> isinstance(list_t,list)
True
list
list長途通過len()函數獲取:
>>> len(list_t)
5
list通過下標獲取單個元素,注意下標從0開始:
>>> list_t[0]
0
下標越界的話,會出錯:
>>> list_t[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
可以通過-1下標獲取倒數第一個元素,-2倒數第二個元素,依次類推:
>>> list_t[-1]
4
>>> list_t[-5]
0
>>> list_t[-6]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
pop從指定位置獲取,並刪除元素:
>>> list_t.pop(1)
1
>>> list_t
[0, 2, 3, 4]
insert在指定位置插入數據:
>>> list_t.insert(1,1)
>>> list_t
[0, 1, 2, 3, 4]
指定超過list長度的位置插入,默認在list的末尾插入:
>>> list_t.insert(10,10)
>>> list_t
[0, 1, 2, 3, 4, 10]
覆蓋更新指定位置:
>>> list_t[1]=10
>>> list_t
[0, 10, 2, 3, 4]
list中的元素也可以是list:
>>> list_t=[0,[1,2,3],4,5]
>>> list_t
[0, [1, 2, 3], 4, 5]
>>> isinstance(list_t,list)
True
同樣通過下標訪問:
>>> list_t[1]
[1, 2, 3]
>>> list_t[1][0]
1
tuple
tuple是不可變的元素集合。不可變體現在2個方面:元素個數不變,元素內容不變。
tuple通過小括號定義:
>>> tuple_t=(0,1,2)
>>> tuple_t
(0, 1, 2)
>>> isinstance(tuple_t,tuple)
True
通過元素下標訪問,下標從0開始:
>>> tuple_t[0]
0
不可更新:
>>> tuple_t[1]=10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
定義一個元素時,需要在元素後加上逗號,以表明是定義一個tuple,而不是小括號對:
>>> tuple_t=(0,)
>>> isinstance(tuple_t,tuple)
True
>>> tuple_t=(0)
>>> isinstance(tuple_t,tuple)
False
理解元素的不變性:
>>> p=[0,1,2]
>>> tuple_t=(3,p,4)
>>> tuple_t
(3, [0, 1, 2], 4)
>>> tuple_t[1][0]=10
>>> tuple_t
(3, [10, 1, 2], 4)
>>> isinstance(tuple_t,tuple)
True
這裏通過tuple_t[1][0]對p[0]進行賦值,改變了p[0]的值。但是tuple_t[1]的值本身並沒有改變。可以理解爲tuple_t[1]存儲的是對象的指針。這個指針指向了p。指針沒有變,僅僅是指針指向的內容發生了變化。
可以定義空的tuple,雖然看不出有什麼意義:
>>> tuple_t=()
>>> tuple_t
()
>>> isinstance(tuple_t,tuple)
True
dict
dict存儲key:value形式的鍵值對,寫入順序與存儲順序不一定相同。檢索性能優秀,是對key進行hash以確定value的存儲地址,快速的找到value值。內存佔用大,屬於以空間換時間。存取自由,與list相反,如果在list中間插入數據的話,可想要將其後的元素都往後挪一位耗費巨大。
使用花括號定義:
>>> dict_t={'key1':'value1','key2':'value2'}
>>> dict_t
{'key2': 'value2', 'key1': 'value1'}
>>> isinstance(dict_t,dict)
True
key需要使用不變值,注意下面的定義,已經將key1轉爲對應的string作爲key存儲。順便注意下輸入順序與存儲順序不同:
>>> key1='mk1'
>>> dict_t={key1:'value1','key2':'value2'}
>>> dict_t
{'key2': 'value2', 'mk1': 'value1'}
使用key獲取元素value
>>> dict_t[key1]
'value1'
>>> dict_t['mk1']
'value1'
使用key複製以及新增:
>>> dict_t['key2']='v2'
>>> dict_t['key3']='v3'
>>> dict_t
{'key2': 'v2', 'key3': 'v3', 'mk1': 'value1'}
for循環獲取全部值:
>>> for k in dict_t:
... print("%s:%s" % (k,dict_t[k]))
...
key2:v2
mk1:value1
key3:v3
使用pop()獲取一個key時,並刪除:
>>> dict_t.pop('key2')
'v2'
>>> dict_t
{'mk1': 'value1', 'key3': 'v3'}
獲取不存在的key時,會報錯。爲避免出錯,可在獲取時,先用in進行校驗,或者通過get()方法返回空或默認值:
>>> dict_t['key2']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'key2'
>>> 'key2' in dict_t
False
>>> dict_t.get('key3')
'v3'
>>> dict_t.get('key2',-1)
-1
>>> dict_t.get('key2')
>>>
set
set只保存key,並且key不能重複。定義時需要輸入list參數:
>>> set_t=set([0,1,2,3])
>>> set_t
{0, 1, 2, 3}
但是set不能通過下標訪問,這是因爲set是與dict本質上相同的,並不是按照輸入順序存儲的數組,是按照key大小排列的。
>>> set_t[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support indexing
通過add方法添加可以,remove()方法刪除
>>> set_t.add(4)
>>> set_t
{0, 1, 2, 3, 4}
>>> set_t.remove(0)
>>> set_t
{1, 2, 3, 4}
pop方法刪除隊首一個元素:
>>> set_t=set([5,0,7,2])
>>> set_t.pop()
0
>>> set_t
{2, 5, 7}
兩個set可以做交併差:
>>> set_t
{2, 5, 7}
>>> set_t1=set([3,6,7])
>>> set_t - set_t1
{2, 5}
>>> set_t & set_t1
{7}
>>> set_t | set_t1
{2, 3, 5, 6, 7}