列表
在實際場景中,除了之前使用過的整型,浮點型,字符串,布爾類型外,用的最多的就是列表和元組
1.列表數據類型
列表的結構:左中括号 表項 右中括号,表項是由逗号隔開,一個列表裡的表項值的數據類型可以不一樣
spam仍然隻被賦予了一個值,叫列表值,隻是這個列表值裡本身包含多個值或者元素,[]空列表,不包含任何值,類似于空字符串
1.1 用下标取值
結果:列表下标是從0開始的,并且下标隻能是整型,不能是浮點型
注意:如果下标>=列表值的個數,就會報列表數組越界
列表裡面可以包含多種數據類型,在有些時候,列表裡面還能包含列表,可以叫做多維列表
結果:
解析:當遇到比較複雜,或者層次結構比較多的列表數據時,最好的方法就是順序取值,一般列表結構有幾層,就需要幾個下标去取值,比如要取子列表[8,9]裡的值,按順序數下來是三層結構,就需要三層下标
第一層:在第二列,下标就是1
第二層:在第二列,下标還是1
第三層:按序取值
最後結果就是spam[1][1][0] 和 spam[1][1][1]
1.2 負數下标
正常情況下,取值都是從頭開始取,但是有時候我們不清楚列表的長度,但是要取出列表最後一個列表項的值,這時候可以使用負數下标
結果:輸出7 和 6
解析:之前說過,列表的下标從頭開始分别是0,1,2,3,.....,那麼從最後開始就是-1,-2,
-3,...
這個記住規則就行
1.3 利用切片取得子列表數據
通過下标我們隻能取得單個數據,利用切片可以去除一組列表數據
下标和切片的區别:
結果:
解析:正常理解是從第一個下标1,對應的值就是2,最後到下标4,對應的值是5,返回的結果應該是[2,3,4,5],但是實際上,結束的下标不包括該值,通用理解可以記住左閉右開的規則,最後生成的結果仍然是一個列表
快捷寫法:
spam[1:]:表示從下标1開始,到列表的最後
spam[:5]:表示從下标0開始,到下表5結束(但不包括5)
spam[:]:表示從下标0開始到列表最後結束
1.4 獲取列表的長度
使用内建函數len()
1.5 使用下标改變列表值
結果:spam列表第一個列表項重新賦值後輸出
1.6 列表連接和列表複制
列表的連接和複制類似字符串, 号可以拼接兩個列表,*可以操作一個列表和一個整數,實現列表的複制
結果:
1.7 删除列表值
通過列表下标删除列表值
結果:[1, 3, 4, 5]
2.使用列表
記錄新員工的工号
結果:
2.1 列表用于循環
通過for和while循環都可以打印列表數據
結果:兩種循環都可以打印出1,2,3,4,5,6,但是在這種情況下,使用for循環更方便
一個比較常見的技巧:在for循環中使用range(len(spam)),叠代列表的每一個下标
結果:
在使用中,range(len(spam))很實用,它可以循環訪問所有的下标以及對應的值
2.2 in 和 not in 操作符
in 和 not in可以确認一個值是否在列表中或者字符串中
in 和 not in在實際業務判斷上會使用很頻繁
2.3 多重賦值技巧
如果想把一個列表中的所有數據分别賦值給多個變量,可以使用這個技巧
結果:cat,dog,fish,但是這種技巧需要明确列表項的個數,而且變量和列表項的個數要相等,否則報錯
3.增強的賦值操作
有時候,我們會對變量本身操作,比如循環的時候,要記錄循環的次數,要對num= num 1操作,但是,有一種快捷方式:num =1 和num = num 1的效果一樣
增強賦值操作符簡表:
4.這對列表使用的方法(函數)
4.1 index()方法在列表中查找值的下标
結果:1和4 ,注意的是如果列表中有相同的元素,隻會返回出現的第一個元素的下标
4.2 用append()和insert()方法在列表中添加值
append()方法是在列表結尾處添加元素,insert方法是可以在列表的任何位置添加元素,因為是根據下标添加,另外,不同于index()方法,append()和insert()方法隻針對列表操作,不可以對其他數據類型操作,否則報錯
結果:
解析:append是在原animal列表的末尾添加了元素dog,随後,又在下标1處插入了元素fish
4.3 remove()方法在列表中删除值
在前面已經使用過del語句删除值,del是在知道要删除列表項的下标的情況下使用,而remove()方法是在知道列表項的值的情況下做删除操作
結果:
解析:如果一個列表中出現多個相同的值,remove隻會删除第一個
4.4 用sort()方法将列表中的值進行排序
在很多情況下,需要對列表中的值進行排序,特别是時間或者數字類的列表
結果:
解析:正常sort()是正序排序,加上reverse=True後為倒序排序,排序的列表裡,元素不能既是數字類型又是字符串類型的,sort()方法默認是ASCII碼進行排序的,如果想使用字典順序排序,需要添加參數key=str.lower
5.類似列表的類型:字符串和元組
字符串在結構上類似列表,可以把字符串裡的每個字符當作是列表項,比如:按下标取值,切片,for循環取值,len(),index(),in 和 not in都可以應用于字符串。
5.1 可變和不可變數據類型
之前的例子中我們已經試過,列表裡的列表項的值可以被替換,但是字符串裡的部分字符不能被替換,隻能全部重新覆蓋。
5.2 元組數據類型
元組數據與列表數據的區别:
(1):列表數據以中括号開始和結尾,元組數據是以小括号開始和結尾
(2):列表的數據可以被修改,增加和删除,而元組數據是不可變的
如果一個元組中隻有一個元素,python就會默認該數據是一個字符串,如果确認是元組類型,需要在後面加一個逗号
結果:type()函數用來說明數據類型,如果隻有一個元素,後面沒有加逗号,python就認為隻是在一個普通的括号内輸入了一個值
如果在特定情況下不想改變數據,就可以使用元組
5.3 用list()和tuple進行數據類型轉換
在前面的章節中,我們通過str(),float(),int()函數對數據類型進行強制轉換,列表和元組的數據結構相似,也可以進行相互轉化。
結果:
6.引用
6.1 傳遞引用
引用是一個比較重要的概念,一不小心,可能就會出bug
先看一個例子
結果:
解析:在字符串和數值型的引用傳遞中,變量保存的是值的 本身,spam一開始存儲值100,便且把100傳遞給了spam1,後來spam重新賦值為101,但是spam1仍然保存的是100這個值,所以沒有變
然而在列表中,情況似乎有些變化
結果:
解析:在列表中,變量存儲的不是數據的本身,而是列表的引用,也可以理解為指向數據的标記,當spam1=spam時,spam1同樣取到了spam的引用(标記),當spam1改變下标為2的數據時,spam1根據這個标記找到了對應的數據,改變了數據的值,所以最後spam和spam1的值都發生了改變。所以,列表間的傳遞時引用(标記)的傳遞,無論傳遞多少次,永遠都指向同一份數據
結論:對于可變數據類型(包括列表和字典(字典下一章講述)),變量存儲的時引用(标記),對于不可變數據(包括字符串,數值型,元組),變量保存的時值
6.2 copy模塊的copy()和deepcopy()函數
在有些場景下,我們不希望另一個變量裡的列表數據發生變化,這時候就用到了copy()和deepcopy()函數 。
結果:
解析:在這種情況下,spam1不是隻拿到了這份數據的引用,而是重新複制了一份數據,引用了這份新的數據,所以無論spam怎麼變,都不影響spam1的結果
另外:如果是多維列表,就是用deepcopy()函數
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!