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]
下标越界的话,会出错:
>>> 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]
>>> 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]
不可更新:
>>> 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()
>>> 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}