Python學習筆記(3)-資料結構
資料結構
序列
序列是Python中最基本的一種資料結構,資料結構指計算機中資料儲存的方式,序列用於儲存一組有序的資料,所有的資料在序列當中都有一個唯一的位置(索引),並且序列中的資料會按照新增的順序來分配索引
序列的分類
可變序列(序列中的元素可以改變)
- 列表(list)
不可變序列(序列中的元素不能改變)
- 字串(str)
- 元組(tuple)
- 集合(set)
可變物件
每個物件中都儲存了三個資料
- id(標識)
- type(型別)
- value(值)
列表就是一個可變物件
a = [1,2,3]
a[0] = 10 (改物件)
- 這個操作是在通過變數去修改物件的值
- 這種操作不會改變變數所指向的物件
- 當我們去修改物件時,如果有其他變數也指向了該物件,則修改也會在其他的變數中體現
a = [4,5,6] (改變數)
- 這個操作是在給變數重新賦值
- 這種操作會改變變數所指向的物件
- 為一個變數重新賦值時,不會影響其他的變數
- 一般只有在為變數賦值時才是修改變數,其餘的都是修改物件
列表
列表是Python中的一個用來儲存物件的物件,物件是記憶體中專門用來儲存資料的一塊區域,數值只能儲存一個單一的資料,列表中可以儲存多個有序的資料
基本使用
1.建立列表,通過[]來建立列表
my_list = [] 建立了一個空列表
2.列表儲存的資料,我們稱為元素,一個列表中可以儲存多個元素,也可以在建立列表時,來指定列表中的元素
my_list = [10] 建立一個只包含一個元素的列表
3.當向列表中新增多個元素時,多個元素之間使用,隔開
my_list = [10,20,30,40,50] 建立了一個包含5個元素的列表
4.列表中可以儲存任意的物件
my_list = [10,'hello',True,None,[1,2,3],print]
5.通過索引獲取列表中的元素
列表中的物件都會按照插入的順序儲存到列表中,第一個插入的物件儲存到第一個位置,第二個儲存到第二個位置,我們可以通過索引(index)來獲取列表中的元素,索引是元素在列表中的位置,列表中的每一個元素都有一個索引,索引是從0開始的整數,列表第一個位置索引為0,第二個位置索引為1,第三個位置索引為2,以此類推,列表的索引也可以是負數,如果索引是負數,則從後向前獲取元素,-1表示倒數第一個,-2表示倒數第二個,以此類推
list[索引]
如果使用的索引超過了最大的範圍,會丟擲異常,IndexError: list index out
of range
切片
切片指從現有列表中,獲取一個子列表
1.通過切片來獲取指定的元素
2.語法:列表[起始:結束:步長]
- 通過切片獲取元素時,會包括起始位置的元素,不會包括結束位置的元素
- 做切片操作時,總會返回一個新的列表,不會影響原來的列表
- 起始和結束位置的索引都可以省略不寫
- 如果省略結束位置,則會一直擷取到最後
- 如果省略起始位置,則會從第一個元素開始擷取
- 如果起始位置和結束位置全部省略,則相當於建立了一個列表的副本
- 步長表示,每次獲取元素的間隔,預設值是1
- 步長不能是0,可以是負數,如果是負數,則會從列表的後部向前邊取元素
函式
+和*
- +可以將兩個列表拼接為一個列表
- *可以將列表重複指定的次數
in和not in
- in用來檢查指定元素是否存在於列表中,如果存在,返回True,否則返回False
- not in用來檢查指定元素是否不在列表中,如果不在,返回True,否則返回False
len()
獲取列表中的元素的個數,獲取到的長度的值,是列表的最大索引+1
min()
獲取列表中的最小值
max()
獲取列表中的最大值
list.index('xx', x, x)
獲取指定元素在列表中的第一次出現時索引,index()的第二個引數,表示查詢的起始位置,第三個引數,表示查詢的結束位置
list.count('xx')
統計指定元素在列表中出現的次數
方法和函式基本上是一樣,只不過方法必須通過物件.方法()的形式呼叫
通過索引來修改元素
stus[0] = 'sunwukong'
通過del來刪除元素
del stus[2]
通過切片來修改列表
在給切片進行賦值時,只能使用序列
stus[0:2] = ['牛魔王','紅孩兒']
使用新的元素替換舊元素
stus[0:2] = ['牛魔王','紅孩兒','二郎神']
stus[0:0] = ['牛魔王']
向索引為0的位置插入元素
當設定了步長時,序列中元素的個數必須和切片中元素的個數一致
stus[::2] = ['牛魔王','紅孩兒','二郎神']
通過切片來刪除元素
del stus[0:2]
del stus[::2]
以上操作,只適用於可變序列,可以通過list()函式將其他的序列轉換為list
方法
append()
向列表的最後新增一個元素
insert()
向列表的指定位置插入一個元素
引數:
1.要插入的位置
2.要插入的元素
stus.insert(x, 'xx')
extend()
使用新的序列來擴充套件當前序列,需要一個序列作為引數,它會將該序列中的元素新增到當前列表中
stus.extend(x)
clear()
清空序列
pop()
根據索引刪除並返回被刪除的元素
result = list.pop(2)
刪除索引為2的元素
result = list.pop()
刪除最後一個
remove()
刪除指定值的元素,如果相同值得元素有多個,只會刪除第一個
reverse()
用來反轉列表
stus.reverse()
sort()
用來對列表中的元素進行排序,預設是升序排列,如果需要降序排列,則需要傳遞一個reverse=True作為引數
遍歷列表
通過for迴圈來遍歷列表
語法:
for 變數 in 序列 :
程式碼塊
for迴圈的程式碼塊會執行多次,序列中有幾個元素就會執行幾次,每執行一次就會將序列中的一個元素賦值給變數,所以我們可以通過變數,來獲取列表中的元素
元組
元組是一個不可變的序列,它的操作的方式基本上和列表是一致的
基本使用
1.建立元組,使用()來建立元組
my_tuple = (), 建立了一個空元組
2.建立了一個5個元素的元組
my_tuple = (1,2,3,4,5)
元組是不可變物件,不能嘗試為元組中的元素重新賦值
當元組不是空元組時,括號可以省略,如果元組不是空元組,它裡邊至少要有一個
my_tuple = 10,20,30,40
my_tuple = 40,
my_tuple = 10 , 20 , 30 , 40
解包
解包指就是將元組當中每一個元素都賦值給一個變數
a,b,c,d = my_tuple
交換a和b的值,這時我們就可以利用元組的解包
a , b = b , a
my_tuple = 10 , 20 , 30 , 40
在對一個元組進行解包時,變數的數量必須和元組中的元素的數量一致,也可以在變數前邊新增一個*,這樣變數將會獲取元組中所有剩餘的元素
a , b , \*c = my_tuple
a , \*b , c = my_tuple
\*a , b , c = my_tuple
a , b , \*c = [1,2,3,4,5,6,7]
a , b , \*c = 'hello world'
不能同時出現兩個或以上的*變數
== != is is not
== != 比較的是物件的值是否相等
is is not 比較的是物件的id是否相等(比較兩個物件是否是同一個物件)
字典
1.字典屬於一種新的資料結構,稱為對映(mapping),字典的作用和列表類似,都是用來儲存物件的容器,列表儲存資料的效能很好,但是查詢資料的效能的很差
在字典中每一個元素都有一個唯一的名字,通過這個唯一的名字可以快速的查詢到指定的元素,在查詢元素時,字典的效率是非常快的
2.在字典中可以儲存多個物件,每個物件都會有一個唯一的名字,這個唯一的名字,我們稱其為鍵(key),通過key可以快速的查詢value,這個物件,我們稱其為值(value),所以字典,我們也稱為叫做鍵值對(key-value)結構,每個字典中都可以有多個鍵值對,而每一個鍵值對我們稱其為一項(item)
基本使用
使用{}來建立字典
d = {}
建立了一個空字典
建立一個包含資料的字典
語法:
{key:value,key:value,key:value}
字典的值可以是任意物件
字典的鍵可以是任意的不可變物件(int、str、bool、tuple ...),但是一般我們都會使用str
字典的鍵是不能重複的,如果出現重複的後邊的#### 會替換到前邊的
使用 dict()函式來建立字典
每一個引數都是一個鍵值對(這種方式建立的字典,key都是字串)
d = dict(name='孫悟空',age=18,gender='男')
也可以將一個包含有雙值子序列的序列轉換為字典
雙值序列,序列中只有兩個值,[1,2] ('a',3) 'ab'
子序列,如果序列中的元素也是序列,那麼我們就稱這個元素為子序列
d = dict([('name','孫悟飯'),('age',18)])
根據鍵來獲取值
語法:d[key]
通過[]來獲取值時,如果鍵不存在,會丟擲異常 KeyError
get(key[, default]) 該方法用來根據鍵來獲取字典中的值,如果獲取的鍵在字典中不存在,會返回None,也可以指定一個預設值,來作為第二個引數,這樣獲取不到值時將會返回預設值
修改字典
d[key] = value 如果key存在則覆蓋,不存在則新增
setdefault(key[, default]) 可以用來向字典中新增key-value
如果key已經存在於字典中,則返回key的值,不會對字典做任何操作
如果key不存在,則向字典中新增這個key,並設定value
常用方法
in
檢查字典中是否包含指定的鍵
not in
檢查字典中是否不包含指定的鍵
len()
獲取字典中鍵值對的個數
update([other])
將其他的字典中的key-value新增到當前字典中,如果有重複的key,則後邊的會替換到當前的
d = {'a':1,'b':2,'c':3}
d2 = {'d':4,'e':5,'f':6, 'a':7}
d.update(d2)
del d['key']
刪除,可以使用del來刪除字典中的key-value
popitem()
隨機刪除字典中的一個鍵值對,一般都會刪除最後一個鍵值對
刪除之後,它會將刪除的key-value作為返回值返回,返回的是一個元組,元組中有兩個元素,第一個元素是刪除的key,第二個是刪除的value
當使用popitem()刪除一個空字典時,會丟擲異常KeyError:'popitem():dictionary is empty'
pop(key[, default])
根據key刪除字典中的key-value,會將被刪除的value返回
如果刪除不存在的key,會丟擲異常
如果指定了預設值,再刪除不存在的key時,不會報錯,而是直接返回預設值
result = d.pop('d')
result = d.pop('z','這是預設值')
clear()
用來清空字典
d.clear()
copy()
該方法用於對字典進行淺複製
複製以後的物件,和原物件是獨立,修改一個不會影響另一個
注意,淺複製會簡單複製物件內部的值,如果值也是一個可變物件,這個可變物件不會被複制
d = {'a':1,'b':2,'c':3}
d2 = d.copy()
d = {'a':{'name':'孫悟空','age':18},'b':2,'c':3}
d2 = d.copy()
遍歷字典
keys()
該方法會返回一個序列,序列中儲存有字典的所有的鍵
通過遍歷keys()來獲取所有的鍵
for k in d.keys() :
print(k , d[k])
values()
該方法會返回一個序列,序列中儲存有字典的所有的值
for v in d.values():
print(v)
items()
該方法會返回字典中所有的項,它會返回一個序列,序列中包含有雙值子序列
雙值分別是,字典中的key和value
for k,v in d.items() :
print(k , '=' , v)
集合
集合和列表非常相似
不同點:
- 集合中只能儲存不可變物件
- 集合中儲存的物件是無序
- 集合中不能出現重複的元素
基本使用
使用{}來建立集合
s = {10,3,5,1,2,1,2,3,1,1,1,1}
s = {[1,2,3],[4,6,7]} TypeError: unhashable type: 'list'
使用 set()函式來建立集合
s = set()空集合
可以通過set()來將序列和字典轉換為集合
s = set([1,2,3,4,5,1,1,2,3,4,5])
s = set('hello')
s = set({'a':1,'b':2,'c':3}) 使用set()將字典轉換為集合時,只會包含字典中的鍵
常用方法
- 使用in和not in來檢查集合中的元素
- 使用len()來獲取集合中元素的數量
- add() 向集合中新增元素
- update() 將一個集合中的元素新增到當前集合中,update()可以傳遞序列或字典作為引數,字典只會使用鍵
s2 = set('hello')
s.update(s2)
s.update((10,20,30,40,50))
s.update({10:'ab',20:'bc',100:'cd',1000:'ef'})
- pop() 隨機刪除並返回一個集合中的元素
result = s.pop()
- remove() 刪除集合中的指定元素
s.remove(x)
- clear()清空集合
- copy() 對集合進行淺複製
集合運算
建立兩個集合
s = {1,2,3,4,5}
s2 = {3,4,5,6,7}
& 交集
result = s & s2 {3, 4, 5}
| 並集
result = s | s2 {1,2,3,4,5,6,7}
- 差集
result = s - s2 {1, 2}
^ 異或集
result = s ^ s2 {1, 2, 6, 7}
>=/<= 超/子集
如果a集合中的元素全部都在b集合中出現,那麼a集合就是b集合的子集,b集合是a集合超集
a = {1,2,3}
b = {1,2,3,4,5}
result = a <= b True
result = {1,2,3} <= {1,2,3} True
result = {1,2,3,4,5} <= {1,2,3} False
>/< 真超/子集
如果超集b中含有子集a中所有元素,並且b中還有a中沒有的元素,則b就是a的真超集,a是b的真子集
result = {1,2,3} < {1,2,3} False
result = {1,2,3} < {1,2,3,4,5} True