變量只能存一個數(shù)據(jù),而集合能存儲一組數(shù)據(jù)蒿褂;本節(jié)我們來介紹兩種重要的集合:列表與元組
本節(jié)知識大綱:
一圆米、List列表的概念
List列表---一組有序、可變的數(shù)據(jù)集合啄栓;我們可以通過List列表的索引編號(位置編碼)來訪問列表中的元素娄帖;
集合中的任何一個元素,稱為集合的元素或者成員昙楚;
同一個列表集合中可以同時存儲數(shù)字近速、字符、字符串堪旧,甚至包含另一個List削葱;
創(chuàng)建List列表的方法有兩種:
(1)創(chuàng)建的時候直接復制
list01 = [100,90,80,70]
(2)創(chuàng)建空list然后插入
list01 = []
list01.append(100)
list01.append(90)
示例:
輸入學生的數(shù)量,依次輸入學生的成績淳梦,打印出所有的成績
student_number = int(input("請輸入學生的數(shù)量:"))
student_result = []
for i in range(1,student_number+1):
student_result.append(int(input("請輸入第【%d】個學生的成績是:" % i)))
for j in range(0,student_number):
print("第%d個學生的成績是:%d"%(j+1,student_result[j]))
二析砸、List列表元素的訪問
如何取List列表中的元素?[起始索引:結束索引:每次變化的索引值]
list01 = [10,20,30,40,50,60,70,80,90,100]
print(list01[0]) # 結果:10 解釋:訪問列表集合的第一個元素
print(list01[-1]) # 結果:100 解釋:訪問集合的最后一個元素
print(list01[4:]) # 結果:[50,60,70,80,90,100]
print(list01[:4]) # 結果:[10,20,30,40] 解釋:如果只有右邊的數(shù)字爆袍,右邊的編號取不到
print(list01[:-5]) # 結果:[10,20,30,40,50]
print(list01[-5:]) # 結果:[60,70,80,90,100]
print(list01[1:5]) # 結果:[20,30,40,50]
print(list01[-4:-1]) # 結果:[70,80,90]
print(list01[1::2]) #結果:[20, 40, 60, 80, 100] 解釋:[開始索引:結束索引:每次變化索引]
print(list01[-1:-4:-1]) # 結果:[100,90,80]
三首繁、List列表集合的遍歷
遍歷:依次取出集合中所有的元素
- 第一種遍歷方法:while循環(huán)遍歷
i = 0
while i < len(list01):
print("第【%d】個元素是"%(i+1),list01[i])
i+=1
- 第二種遍歷方法:for循環(huán)數(shù)值索引遍歷
i = 0
for i in range(0,len(list01)):
print("第【%d】個元素是" % (i + 1),list01[i])
- 第三種遍歷方法:for循環(huán)集合索引遍歷
i = 0
num = 1
for i in list01:
print("第【%d】個元素是" % num,i)
num+=1
案例:
(1)隨機生成10個三位的整數(shù),打印出大于500的元素陨囊;
補充知識:如何生成隨機數(shù)
import random
a = 0
a = random.randint(100,999)
生成隨機數(shù)需要導入包random弦疮,使用random.randint(起始值,結束值)
包含頭尾生成范圍內的隨機數(shù)。
import random
list01 = []
# 生成10個隨機數(shù)
for i in range(10):
list01.append(random.randint(100,999))
# 打印大于500的元素
for j in list01:
if j>500:
print(j,end=" ")
四蜘醋、List元素的基本操作
1. 賦值:
list01 = [1,2,3]
list02 = list01 # 把list01的值賦給list02
2. 拷貝:
list03 = list01.copy() # 使用copy把list01的值拷貝給list03
雖然值一樣胁塞,但是賦值與拷貝是有本質的區(qū)別的,我們后面會詳細講解压语。
3. 合并
list01 = [1,2,3]
list02 = [4,5,6]
print(list01+list02) # 讓兩個list集合合并
4. 重復
list01 = ['a','b','c']
print(list01*3) # 讓list集合重復3次
5. 計算元素的個數(shù)
list01 = ['a','b','c']
print(len(list01)) # 返回list集合元素的個數(shù)
6. 判斷某個元素是否存在于集合中
list01 = ['a','b','c']
# 使用成員運算符
print("a是否在list01中",'a' in list01) # in啸罢、not in都可以使用
7. 元素的添加
list01 = [1,2,3,4,5] # 直接創(chuàng)建
list02 = [] # 創(chuàng)建一個空列表集合
方法01:使用append方法添加,添加到最后
list02.append("AAA")
list02.append("BBB")
print(list02)
方法02:使用insert方法插入,添加到指定位置
list02.insert(1,"CCC")
print(list02)
方法03:使用extend添加胎食,可以添加一個集合
list02.extend(["DDD","EEE","FFF"])
print(list02)
8. 元素的刪除
方法01:remove(具體的元素的值)
如果列表中有多個要刪除的元素扰才,remove只刪除第一個元素
list01 = ['a','b','c','d','e','f','g','h','i','j']
list01.remove('f')
print(list01)
方法02:pop(元素的索引值)
pop()如果不帶索引值,默認情況下刪除最后一個元素
list01.pop(1) # 刪除第二個元素
print(list01)
list01.pop() # 刪除最后一個元素
print(list01)
方法03:使用del刪除
支持切片刪除
del list01[1]
print(list01)
del list01[1:5] # 切片刪除第二個到第五個
print(list01)
方法04:clear ---清空
list01.clear() # 清空list中所有的元素
print(list01)
五斥季、List集合基本運算
1. 數(shù)學運算
(1)最大值max()
list01 = [45,90,123,987,-10,78,96]
print("List01的最大值:",max(list01))
如果列表中的元素是字符串训桶,則最大值根據(jù)字符串首字母的ASCII碼值進行大小排序累驮,最小為A
酣倾,最大為z
(2)最小值min()
list01 = [45,90,123,987,-10,78,96]
print("List01的最小值:",min(list01))
(3)求和sum()
list01 = [45,90,123,987,-10,78,96]
print("list所有元素和:%d"%sum(list01))
2. 排序和反轉
(1)使用sort()進行排序
默認是升序
list01 = [12,33,44,55,6,22]
list01.sort()
print(list01)
使用sort排序,是更改存儲的順序
(2)倒序排列
方法01:先升序谤专,再反轉
使用reverse()方法進行逆序操作
list01 = [12,33,44,55,6,22]
list01.sort()
list01.reverse()
print(list01)
方法02:添加參數(shù)reverse
list01 = [12,33,44,55,6,22]
list01.sort(reverse=True)
print(list01)
(3)臨時排序
使用sort()方法進行排序后躁锡,會更改原有存儲的順序;但是我們只想要其按照順序打印但是不改變原有的存儲順序置侍,我們可以使用sorted()方法
list01 = [12,33,44,55,6,22]
print(sorted(list01)) # 臨時排序映之,不影響存儲數(shù)據(jù)的順序
print(list01)
3. 索引查找
如果能找找到拦焚,返回該元素的第一個索引值,也支持指定片段查找杠输,index(元素值,開始,結束)赎败,查到顯示索引,查不到顯示異常
list01 = [45,90,45,123,987,-10,78,96]
print(list01.index(45)) # 查找第一個45
print(list01.index(45,1,3) # 查找第二到第三個元素范圍內值為45的索引
4. 統(tǒng)計
統(tǒng)計list集合中蠢甲,指定數(shù)值的元素出現(xiàn)多少次僵刮,如果沒有則返回0
list01 = [45,90,45,123,987,-10,78,96]
print(list01.count(45)) # 獲取45這個元素出現(xiàn)的次數(shù)
案例:
(1)有五名學生【張三、李四鹦牛、王五搞糕、趙六、馬七】曼追,每個學生有五門科目【語文窍仰、數(shù)學、英語礼殊、物理驹吮、化學】,為這5名同學隨機生成5門考試成績【介于50-100之間】膏燕,需求:按照平均分的倒序打印出成績的明細钥屈。
import random
# student_name存儲學生姓名
student_name = ['張三','李四','王五','趙六','馬七']
# student_result存儲學生明細
student_result = []
# 使用循環(huán)生成每個人每個科目的成績
for i in range(len(student_name)):
list_temp = []
for j in range(5): # 5門科目成績
list_temp.append(random.randint(50,100)) # 每次一個成績
# 把5門科目插入到student_result
student_result.append(list_temp)
# 統(tǒng)計出每個人的總分
student_total_result = [] # 存儲每個人的總分
for i in student_result:
student_total_result.append(sum(i))
print("名次 姓名 語文 數(shù)學 英語 物理 化學 總分 均分")
print("=====================================")
for i in range(len(student_name)):
max_result = max(student_total_result) # 獲取最高分數(shù)
max_index = student_total_result.index(max_result) # 獲取最高分的編號
# 打印--名次
print(i+1,end="\t")
# 打印--姓名
print(student_name[max_index],end="\t ")
# 打印--成績5門
for i in range(5):
print(student_result[max_index][i],end="\t ")
# 打印--總分
print(max_result,end=" ")
# 打印--均分
print(max_result/5)
# 刪除信息--總分
student_total_result.pop(max_index)
# 刪除信息--成績明細
student_result.pop(max_index)
# 刪除信息--姓名
student_name.pop(max_index)
print("=====================================")
六、List數(shù)據(jù)存儲
具體的值在內存中只存一份坝辫,列表存儲的過程原理如下圖所示
如果list01里的數(shù)據(jù)發(fā)生了變化篷就,list02也會跟著變化,但是list03不受影響近忙。
七竭业、淺拷貝和深拷貝
淺拷貝與深拷貝有什么區(qū)別?
案例:
import copy
list01 = [44,55,66]
list02 = [11,22,33,list01]
list03 = list02 # 直接賦值
list04 = list02.copy() # 淺拷貝-copy
list05 = copy.copy(list02) # 淺拷貝-copy
list06 = copy.deepcopy(list02) # 深拷貝-deepcopy
我們用示意圖來解釋以上淺拷貝與深拷貝具體原理:
如果我們將list01與list02的部分數(shù)值進行修改:
list01[0] = 88
list02[0] = 99
那么此時的原理圖如下:
最終打印list01至list06的結果為:
# 打印結果
list01:[88, 55, 66]
list02:[99, 22, 33, [88, 55, 66]]
list03:[99, 22, 33, [88, 55, 66]]
lisr04:[11, 22, 33, [88, 55, 66]]
list05:[11, 22, 33, [88, 55, 66]]
list06:[11, 22, 33, [44, 55, 66]]
賦值:直接把變量關聯(lián)的地址賦值到另一個變量
淺拷貝:把內存地址的下一層完全復制一份出來,實現(xiàn)的方式有兩種:
# 淺拷貝方式一:
list04 = list02.copy()
# 淺拷貝方式二:
import copy
list05 = copy.copy(list02)
深拷貝:把對應的整個架構都完整的復制一份出來
但是不管哪一種存儲方式及舍,值在內存空間只存儲一份未辆!
八、認識元組
1. 元組的概念
元組(Tuple)是一組有序的锯玛、不可變的數(shù)據(jù)集合(不可改的List)
在定義的時候咐柜,主要元組用的是小括號(),是可以通過下標進行訪問的攘残,也可以通過切片進行訪問
# 元組的創(chuàng)建和訪問
tuple01 = (11,22,33,44,55,66)
print(tuple01[0]) # 通過下標訪問第一個元素
print(tuple01[1:5]) # 通過切片訪問第二個到第五個元素
2. 元組的創(chuàng)建
(1)常規(guī)元組創(chuàng)建
一開始就得全部聲明拙友,因為后面是不可以更改的
# 常規(guī)元組創(chuàng)建的方法
tuple01 = (11,22,33,44,55) # 元組的創(chuàng)建
tuple02 = () # 空元組也是可以創(chuàng)建的
(2)單個元組的創(chuàng)建
如果創(chuàng)建單元素的元組不能直接寫成tupel03 = (11),因為這種創(chuàng)建方式默認創(chuàng)建的整型歼郭,那么怎么創(chuàng)建單元素的元組呢遗契?
我們需要在單個元素后面添加一個逗號,這樣就能夠創(chuàng)建單個元素的元組了:
# 創(chuàng)建單元素元組
tuple03 = (11,) # 單元素元組一定要加逗號
(3)元組的拼接
元組雖然不可以修改病曾,但是支持多個元組的拼接牍蜂;
# 元組的拼接
tuple04 = tuple01 + tuple03
九漾根、元組常用的方法
1. 元組中可以用的常用方法
(1)整體賦值操作
# 元組使用整體賦值運算符
tuple01 = (11,22,33,44)
tuple02 = tuple01
(2)拼接操作
tuple01 = (11,22,33,44)
tuple02 = (55,66)
tuple03 = tuple01 + tuple02
print(tuple03)
(3)打印指定遍數(shù)
# 元組使用*運算符
tuple01 = (11,22)
print(tuple01 * 3)
(4)求元組的長度
# 元組使用求長度運算符
tuple01 = (11,22,33)
print(len(tuple01))
(5)是否包含
# 元組使用是否包含運算符
tuple01 = (11,22,33)
print("是否包含11:",11 in tuple01)
(6)求最值、求和
# 元組的計算
tuple01 = (11,22,33,44,999,66,2)
print(max(tuple01))
print(min(tuple01))
print(sum(tuple01))
(7)查找
# 元組的查找
tuple01 = (-11,11,13,44,999,66,2)
print(tuple01.index(11))
(8)統(tǒng)計元素的次數(shù)
# 統(tǒng)計出現(xiàn)的次數(shù)
tuple01 = (-11,11,13,44,999,66,11)
print(tuple01.count(11))
2.元組不可以使用的方法
元組不可以直接使用列表中的添加鲫竞、插入辐怕、刪除方法,但是注意:雖然元組里直接的元素沒法改从绘,但是元組里嵌套了list的話秘蛇,還是可以非常方便的增加、刪除顶考、修改list元素的赁还。
# 修改元組中嵌套的列表元素
tuple01 = (11,22,33,44,[44,55,66])
tuple01[4].append(77)
tuple01[4].remove(55)
tuple01[4].extend([88,99])
print(tuple01)
3. 特殊方法
(1)元組的刪除
元組里的單個元素是無法刪除的,但是可以用del方法驹沿,把整個元組刪除
# 元組的刪除
tuple01 = (11,22,33)
del tuple01
(2)元組的排序
用于排序的sort()方法艘策,和反轉排序的reverse()方法,改變了元素的存儲位置所以不可用于元組的排序渊季,但是臨時排序sorted()方法就可以朋蔫,因為它并沒有改變元素的原始存儲位置,只是用于排序輸出
tuple01 = (-11,1,13,44,999,66,2)
print(sorted(tuple01))
十却汉、元組的案例演示
案例1:
輸入一個數(shù)字驯妄,轉換成中文數(shù)字,比如:1234567890轉換成壹貳叁肆伍陸柒捌玖零
# 定義漢字數(shù)字元組
tuple_chinese = ('零','壹','貳','叁','肆','伍','陸','柒','捌','玖')
# 定義阿拉伯數(shù)字元組
tuple_num = (0,1,2,3,4,5,6,7,8,9)
# 讀取輸入的數(shù)值字符串
num_input = input("請輸入數(shù)字:")
for i in range(len(num_input)):
if num_input[i] == '.':
print("點",end="")
else:
# 把讀取到的數(shù)值字符串每一個數(shù)逐一轉為整型
num_single = int(num_input[i])
print(tuple_chinese[num_single],end="")
案例2:
根據(jù)花色和數(shù)字生成一副撲克牌
# 案例:根據(jù)花色和數(shù)字生成一副撲克牌
poker_type = ("?","?","?","?")
poker_number = ("3","4","5","6","7","8","9","10","J","Q","K","A","2")
count = 0
for i in poker_number:
for j in poker_type:
print(j+i,end="\t")
count+=1
print()
print("撲克有%d張"%count)