Python基礎學習筆記(四)列表與元組

變量只能存一個數(shù)據(jù),而集合能存儲一組數(shù)據(jù)蒿褂;本節(jié)我們來介紹兩種重要的集合:列表與元組
本節(jié)知識大綱:


圖片.png

圖片.png

一圆米、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列表集合的遍歷

遍歷:依次取出集合中所有的元素

  1. 第一種遍歷方法:while循環(huán)遍歷
i = 0
while i < len(list01):
    print("第【%d】個元素是"%(i+1),list01[i])
    i+=1
  1. 第二種遍歷方法:for循環(huán)數(shù)值索引遍歷
i = 0
for i in range(0,len(list01)):
    print("第【%d】個元素是" % (i + 1),list01[i])
  1. 第三種遍歷方法: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ù)存儲

具體的值在內存中只存一份坝辫,列表存儲的過程原理如下圖所示


圖片.png

如果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

我們用示意圖來解釋以上淺拷貝與深拷貝具體原理:


圖片.png

如果我們將list01與list02的部分數(shù)值進行修改:

list01[0] = 88
list02[0] = 99

那么此時的原理圖如下:


圖片.png

最終打印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)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末合砂,一起剝皮案震驚了整個濱河市青扔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翩伪,老刑警劉巖微猖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缘屹,居然都是意外死亡凛剥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門轻姿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犁珠,“玉大人,你說我怎么就攤上這事互亮±缦恚” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵胳挎,是天一觀的道長饼疙。 經(jīng)常有香客問我溺森,道長慕爬,這世上最難降的妖魔是什么窑眯? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮医窿,結果婚禮上磅甩,老公的妹妹穿的比我還像新娘。我一直安慰自己姥卢,他們只是感情好卷要,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著独榴,像睡著了一般僧叉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棺榔,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天瓶堕,我揣著相機與錄音,去河邊找鬼症歇。 笑死郎笆,一個胖子當著我的面吹牛,可吹牛的內容都是我干的忘晤。 我是一名探鬼主播宛蚓,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼设塔!你這毒婦竟也來了凄吏?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤闰蛔,失蹤者是張志新(化名)和其女友劉穎竞思,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钞护,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡盖喷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了难咕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锦积。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖换薄,靈堂內的尸體忽然破棺而出藐唠,到底是詐尸還是另有隱情,我是刑警寧澤爆土,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布椭懊,位于F島的核電站,受9級特大地震影響步势,放射性物質發(fā)生泄漏氧猬。R本人自食惡果不足惜背犯,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盅抚。 院中可真熱鬧漠魏,春花似錦、人聲如沸妄均。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丰包。三九已至禁熏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邑彪,已是汗流浹背匹层。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锌蓄,地道東北人升筏。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像瘸爽,于是被迫代替她去往敵國和親您访。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359