1 序列(sequence)
1.1 基本概念
- 序列是python中最基本的一種數據結構
- 數據結構是計算機中數據存儲的方式
- 序列用於保存一種有序數據,所有數據在序列中都由一個唯一的位置
- 每個數據在序列中的唯一位置稱之爲“索引”,索引的分配是按照數據添加的順序來進行分配的
1.2 序列的分類
- 可變序列,如列表(list)、字典(dict)
- 不可變序列,如字符串(str)、元組(tuple)
2 列表
- 列表list是python中的一個對象
- 列表是用來存儲對象的對象
- 列表中可以保存多個有序的數據
2.1 列表的使用
- 列表的創建:通過[]進行空列創建
# 通過[]創建列表
# lst=[1,2,3]
# 列表可以保存任意的對象
lst=[1,'name',[1,2,1],True]
print(lst,type(lst))
# 索引是從0開始
print(lst[1])
# len()獲取列表長度(索引最大值)或字符串長度
print(len(lst))
# 列表參數爲負
print(lst[-1])
2.2 切片
- 切片是指從現有列表中獲取一個子列表
- 可通過切片來獲取指定的元素
- 語法:列表[起始:結束:步長]
- 通過切片獲取數據時會包括起點元素,但不包括重點數據
- 省略起點和終點位置
。省略起點位置:從第一個元素開始截取
。省略終點位置:截取一直到終點的所有數據
。起點和終點都省略:截取所有從第一個到最後一個數據元素 - 步長表示每次獲取元素的間隔,不寫默認爲1
- 步長不可爲0,負數表示逆向
# 切片是從現有列表中獲取一個子列表,不影響原列表值
# 通過切片來獲取指定元素
# 語法:列表[開始:結束:步長]
hero = ['鋼鐵俠','綠巨人','蜘蛛俠','黑寡婦','蟻人','美國隊長']
print(hero[2:4]) #['蜘蛛俠', '黑寡婦']
print(hero[:3]) #['鋼鐵俠', '綠巨人', '蜘蛛俠']
print(hero[1:]) #['綠巨人', '蜘蛛俠', '黑寡婦', '蟻人', '美國隊長']
print(hero[:]) #['鋼鐵俠', '綠巨人', '蜘蛛俠', '黑寡婦', '蟻人', '美國隊長']
print(hero[::1]) #['鋼鐵俠', '綠巨人', '蜘蛛俠', '黑寡婦', '蟻人', '美國隊長']
print(hero[::2]) #['鋼鐵俠', '蜘蛛俠', '蟻人']
print(hero[::-2]) #['美國隊長', '黑寡婦', '綠巨人']
print(hero[::-1]) # ['美國隊長', '蟻人', '黑寡婦', '蜘蛛俠', '綠巨人', '鋼鐵俠']
3 通用操作
- + 和 *
。+ 可以將兩個列表拼接成一個列表
。* 可以將列表重複指定的次數 (注意2個列表不能夠做乘法,列表可以和整數做乘法運算)
# +、*
lst=[1,2,3]+[4,5,6]
print(lst) # [1, 2, 3, 4, 5, 6]
# lst=[1,2,3]*[4,5,6] #can't multiply sequence by non-int of type 'list'
# print(lst)
# 列表與整數相乘使列表拼接本身內容整數次
lst=[1,2,3]*2
print(lst) # [1, 2, 3, 1, 2, 3]
- in 和 not in
。in用來檢查指定元素是否在列表當中
。not in 用來檢查指定元素是否不在列表當中
# in 和 not in
# in 判斷指定元素是否存在指定列表中
hero = ['鋼鐵俠','綠巨人','蜘蛛俠','黑寡婦','蟻人','美國隊長']
print('綠巨人'in lst) #False
print('綠巨人'in hero) #True
print('綠巨人'not in lst) #True
- len() 獲取列表中元素的個數
- max() 獲取列表中最大值
- min() 獲取列表中最小值
# max()、min()獲取最大、最小值
print(max(lst),min(lst)) # 3 1
# print(max(hero),min(hero)) #按字符ascii碼進行比較,字符串比較大小
# print(ord('鋼'),ord('綠'),ord('蜘'),ord('黑'),ord('蟻'),ord('美'))
- list.index(x, start, end)
。第一個參數 獲取指定元素在列表中的位置
。第二個參數 表示查找的起始位置
。第三個參數 表示查找的結束位置
lst=[1,2,3,1,2]
# print(hero.index('蜘蛛俠')) #2
print(lst.index(1),lst.index(2)) # 0 1 列表中有重複值時取第一個值
# 想要查找重複值中其他值時,可以越過第一個或者指定範圍
# 跳過
print(lst.index(1,1),lst.index(2,2))# 3 4
# 指定範圍 index(*,*,*)第一個參數爲查找元素,第二個參數爲起點索引,第三個參數爲終點索引
print(lst.index(1,1,4)) # 3
# lst.count()統計出現次數
print(lst.count(1)) # 2
- list.count(x) 統計指定元素在列表中出現的個數
4 修改列表
- 通過切片來修改列表(就是給切片的內容重新賦值,但是賦值的內容必須是一個序列)
- 當設置了步長時,序列中元素的個數必須和切片中元素的個數保持一致
- 通過切片來刪除元素
。del list [起始 :結束]
。list[1:2] = []
hero = ['鋼鐵俠','綠巨人','蜘蛛俠','黑寡婦','蟻人','美國隊長']
# # 通過索引
# print(hero) #修改前
# hero[0]='雷神'
# print(hero) #修改後 ['雷神', '綠巨人', '蜘蛛俠', '黑寡婦', '蟻人', '美國隊長']
# # 通過del刪除元素
# del hero[2]
# print(hero) #['雷神', '綠巨人', '黑寡婦', '蟻人', '美國隊長']
# 通過切片更改,傳遞的必須也是一個序列
# hero[0:3]='abcd' # ['a', 'b', 'c', 'd', '黑寡婦', '蟻人', '美國隊長']
# hero[0:3]= abcd # NameError: name 'abcd' is not defined
#hero[0:3]= '123' # ['1', '2', '3', '黑寡婦', '蟻人', '美國隊長']
#hero[0:3]= 123 # TypeError: can only assign an iterable
print('修改前:',hero)
# #三個元素替換兩個元素,ok
# hero[0:2]=['黑豹','雷神','滅霸'] # ['黑豹', '雷神', '滅霸', '蜘蛛俠', '黑寡婦', '蟻人', '美國隊長']
# 向索引爲0位置插入元素
# hero[0:0]=['雷神'] #['雷神', '鋼鐵俠', '綠巨人', '蜘蛛俠', '黑寡婦', '蟻人', '美國隊長']
# 當設置了步長時,序列元素個數與切片中元素個數必須一致
# hero[::2]=['雷神'] # ValueError: attempt to assign sequence of size 1 to extended slice of size 3
# hero[::2]=['黑豹','雷神','滅霸']
# 通過切片刪除元素
# hero[0:1]=[] # ['綠巨人', '蜘蛛俠', '黑寡婦', '蟻人', '美國隊長']
# del hero[0:2]
print('修改後:',hero)
- 所謂修改只針對可變序列,字符串和元組不可變的當然不能直接修改,但可以通過轉化爲可修改序列操作
# 只有可變序列纔可以修改
s='python'
# s[1]='i' # TypeError: 'str' object does not support item assignment
s=list(s)
s[1]='i' #['p', 'i', 't', 'h', 'o', 'n']
print(s)
5 列表的方法
- append() 向列表的最後添加一個元素
- insert(arg1,arg2) 向列表指定位置插入一個元素:參數1-要插入的位置,參數2-要插入的元素
- extend( iterable ) 使用一個新的序列來擴展當前序列(它會將該序列的中元素添加到列表中) 參數需要傳遞一個序列
- pop() 根據索引刪除並返回指定元素
- remove() 刪除指定元素 (如果相同值的元素有多個,只會刪除第一個)
- reverse() 翻轉列表
- sort(key=None,reverse=False) 用來對列表中的元素進行排序 reverse:True反序,False 正序
hero = ['鋼鐵俠','綠巨人','蜘蛛俠'] # ,'黑寡婦','蟻人','美國隊長'
# print('修改前:',hero)
# hero[3]='b' #IndexError: list assignment index out of range
# .append()向列表最後添加一個元素
# hero.append('黑寡婦')
# insert是向列表指定位置添加一個元素,參數1-位置,參數2-元素
# hero.insert(2,'黑寡婦') # ['鋼鐵俠', '綠巨人', '黑寡婦', '蜘蛛俠']
# hero.insert(5,'蟻人') #修改後: ['鋼鐵俠', '綠巨人', '蜘蛛俠', '蟻人']當插入位置超出最大值時永遠在末尾插入一個值,而不是報錯
# extend 使用新的序列來擴展當前序列
# hero.extend(123) # TypeError: 'int' object is not iterable
# hero.extend(['黑寡婦','蟻人']) # 修改後:['鋼鐵俠', '綠巨人', '蜘蛛俠', '黑寡婦', '蟻人']
# hero+=['黑寡婦','蟻人'] # 修改後: ['鋼鐵俠', '綠巨人', '蜘蛛俠', '黑寡婦', '蟻人']
# clear清空集合
# hero.clear() # 修改後: []
# pop根據索引刪除並返回指定的元素
# hero.pop(2)
# pop 中沒指定索引值時刪除最後一個元素
# print('修改後:',hero.pop(2)) #修改後: 蜘蛛俠
# print('修改後:',hero.pop()) #修改後: 蜘蛛俠
# remove 根據指定的元素刪除值,如果有重複值刪除第一個
# hero.insert(3,'綠巨人')
# hero.remove('綠巨人')
# print('修改後:',hero.remove('綠巨人')) # 修改後: None 無返回值
# reverse 反轉列表
# hero.reverse()
# print('修改後:',hero) # 修改後: ['蜘蛛俠', '綠巨人', '鋼鐵俠']
# # sort默認升序排列
# lst=list('asddfipdofi')
# print('修改前:',lst)
# lst.sort()
# print('修改後:',lst) # 修改後: ['a', 'd', 'd', 'd', 'f', 'f', 'i', 'i', 'o', 'p', 's']
# lst.sort(reverse=True)
# print('修改後:',lst) # 修改後: ['s', 'p', 'o', 'i', 'i', 'f', 'f', 'd', 'd', 'd', 'a']
6 遍歷列表
6.1 for循環
- 通過for循環來遍歷列表
- 語法:
for 變量 in 序列:
代碼塊 - 注意: for循環的代碼塊會執行多次,序列中有幾個元素就會執行幾次。每執行一次就會將序列中的一個元素賦值給變量,所以我們可以通過變量來獲取列表中的元素
'''
for 語句中的代碼塊循環執行n次,n爲列表中元素的個數,每執行一次從列表中取出一個值賦值給變量
'''
for i in hero:
print(i,' ',end='')
# 執行結果是 鋼鐵俠 綠巨人 蜘蛛俠 黑寡婦
6.2 range(start,stop[, step])
- 參數說明
。start:計數從 start 開始,默認是從 0 開始,例如range(5)等價於range(0, 5)
。stop:計數到 stop 結束,但不包括 stop,例如range(0, 5) 是[0, 1,2, 3, 4]沒有5
。step:步長,默認爲1,例如:range(0, 5) 等價於 range(0, 5, 1)
# range
'''
開始 默認是0,可以省略
結束 不包含結束元素
步長 默認爲1,可以省略
'''
# 舉例獲取列表中的奇數
lst=[1,2,3,4,5,6,7,8,9]
# print(list(range(0,20,2))) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
'''這裏的i是索引值啦'''
# for i in range(0,9,2):
# print(lst[i],' ',end='') # 1 3 5 7 9
for i in range(len(lst)):
# print(i,end='') # 此時i爲索引值 012345678
print(lst[i],end='') # 此時爲列表元素值 123456789