什麼是列表? 列表是由一系列按照特定順序排列的元素組成,直觀理解就是:數組。 只不過python的列表有點特別,他不限制存儲的元素類型,使用手感上來說反倒更像是對標Java中的ArrayList。 flowers = ['Rose','Lily','Jasmine','Rosemary'] prin ...
什麼是列表?
列表是由一系列按照特定順序排列的元素組成,直觀理解就是:數組。 只不過python的列表有點特別,他不限制存儲的元素類型,使用手感上來說反倒更像是對標Java中的ArrayList。
flowers = ['Rose','Lily','Jasmine','Rosemary'] print(flowers)
列印結果:
['Rose', 'Lily', 'Jasmine', 'Rosemary']
創建空列表:
flowers = []
訪問元素
訪問列表中的元素,都是用索引來訪問,從0開始遞增。
flowers = ['Rose','Lily','Jasmine','Rosemary'] print(flowers[0])
列印結果:
Rose
如果我要取最後一個元素呢?
其他編程語言的做法都是先取列表的總長度,然後總長度-1得到最後一個元素的索引。
在python里可以用-1來表示最後一個元素的索引:
flowers = ['Rose','Lily','Jasmine','Rosemary'] print(flowers[-1])
列印結果:
Rosemary
取倒數第二個元素:
flowers = ['Rose','Lily','Jasmine','Rosemary'] print(flowers[-2])
列印結果:
Jasmine
請註意:如果列表為空,那麼訪問最後一個元素會出錯,同樣的如果列表只有一個元素,訪問倒數第二個元素也會出錯。
字元串與列表
字元串是不是列表?
字元串就是由字元組成的序列,在某個視角上來看,字元串屬於是一種特殊的列表,但是它不等於列表,只是python這門語言提供了一些獨有的特性,使得我們可以用列表的操作方式來操作字元串。
word = 'abcdefg' print(word[0])
列印結果:
a
字元串與列表的轉換
字元串雖然可以看成列表,但是它與列表的數據類型,應用場景,表現方式都完全不同,所以有些時候我們需要類型轉換。
字元串轉列表:
word = 'abcdefg' print(word) print(list(word))
列印結果:
abcdefg
['a', 'b', 'c', 'd', 'e', 'f', 'g']
列表轉字元串:
flowers = ['Rose','Lily','Jasmine','Rosemary'] print(flowers) print(''.join(flowers))
列印結果:
['Rose', 'Lily', 'Jasmine', 'Rosemary']
RoseLilyJasmineRosemary
基礎操作
在列表末尾添加元素 insert()
word = [] word.append('a') word.append('b') word.append(2) word.append('c') print(word)
列印結果:
['a', 'b', 2, 'c']
請註意:很多操作方法是直接改變列表本身,方法本身不會有返回值,需要仔細留意。
在列表中插入元素 insert()
word = ['a','b','c','d'] word.insert(1,'xxx') print(word)
列印結果:
['a', 'xxx', 'b', 'c', 'd']
刪除列表元素 del
word = ['a','b','c','d'] del word[1] print(word)
列印結果:
['a', 'c', 'd']
彈出列表元素 pop()
pop是棧的標準操作,在這裡python提供了這一方法,可以彈出列表中的元素,彈出來的元素可以用變數接收,進一步供業務邏輯使用,而原列表的改變與del刪除元素相同,預設每次彈出列表末尾的元素。
word = ['a','b','c','d'] s = word.pop() print(word) print(s)
列印結果:
['a', 'b', 'c']
d
你也可以彈出任意位置的元素
word = ['a','b','c','d'] s = word.pop(0) print(word) print(s)
列印結果:
['b', 'c', 'd']
a
python沒有提供push方法,但是我們不管是需要先進先出還是先進後出的數據結構,都可以用 insert + append + pop 三個方法進行組合完成。
根據值刪除元素 remove()
如果你知道要刪除的值,但是不知道他的下標,那麼可以使用remove方法進行刪除
word = ['a','b','b','c','d'] word.remove('b') print(word)
列印結果:
['a', 'b', 'c', 'd']
如你所見,remove只能刪除第一個值,如果你要刪除的值可能在列表中出現多次,那麼只能遍歷處理。
獲取列表長度 len()
word = ['a','b','c'] print(len(word))
列印結果:
3
元素在列表中出現的次數 count()
word = ['a','b','b','c','d'] i = word.count('b') print(i)
列印結果:
2
合併列表 extend()
word = ['a','b','b','c','d'] num = [2,3,4] word.extend(num) print(word)
列印結果:
['a', 'b', 'b', 'c', 'd', 2, 3, 4]
實際上你也可以直接用加號 將兩個列表相加
word = ['a','b','b','c','d'] num = [2,3,4] all = word + num print(all)
列印結果:
['a', 'b', 'b', 'c', 'd', 2, 3, 4]
不同之處是 一個是在原列表上做擴充,一個是新建一個列表進行裝載。
組織列表
永久性排序 sort()
正序:
word = ['e','b','a','c','d'] word.sort() print(word)
列印結果:
['a', 'b', 'c', 'd', 'e']
倒序:
word = ['e','b','a','c','d'] word.sort(reverse=True) print(word)
列印結果:
['e', 'd', 'c', 'b', 'a']
臨時性排序 sorted()
臨時性排序不會改變原來的列表,而是sorted方法會返回一個排序後的結果列表。
word = ['e','b','a','c','d'] print(sorted(word))
列印結果:
['a', 'b', 'c', 'd', 'e']
同樣的 倒序也是加上reverse參數:
word = ['e','b','a','c','d'] print(sorted(word,reverse=True))
列印結果:
['e', 'd', 'c', 'b', 'a']
實際上sorted可以傳入任何序列,但它總是返回一個列表.
如下演示將一個字元串進行排序
word = 'ebdcgaf' lis = sorted(word) print(lis) print(''.join(lis))
列印結果:
['a', 'b', 'c', 'd', 'e', 'f', 'g']
abcdefg
反轉列表 reverse()
反轉列表與排序無關,僅僅是將列表元素反向排列。
word = ['e','b','a','c','d'] word.reverse()
列印結果:
['d', 'c', 'a', 'b', 'e']
那如果想要恢複列表怎麼辦呢? 那就把反轉之後的列表再反轉,也就恢復了。
遍歷列表
python中遍歷的寫法是for xx in list,末尾跟個冒號,第二行開始縮進,進入迴圈之中。
word = ['a','b','c'] for name in word: print('這個單詞是:' + name)
列印結果:
這個單詞是:a
這個單詞是:b
這個單詞是:c
for迴圈中的代碼一律縮進,如果某一行沒縮進,就代表出了迴圈了。
word = ['a','b','c'] for name in word: print('這個單詞是:' + name) print('已經迴圈完了哦')
列印結果:
這個單詞是:a
這個單詞是:b
這個單詞是:c
已經迴圈完了哦
數字列表
快速生成 range()
你可以直接列印出一堆臨時生成的數字,range方法的參數為起止數字,但是不包含結束數字。
for num in range(1,5): print(num)
列印結果:
1
2
3
4
range方法的結果並不是一個直接可用的數字列表,如果要轉成列表,可以使用list方法將它轉化一下。
nums = list(range(1,5)) print(nums)
列印結果:
[1, 2, 3, 4]
range還有第三個參數,可以指定步長
nums = list(range(1,11,2)) print(nums)
列印結果:
[1, 3, 5, 7, 9]
列表統計 min、max、sum
統計列表中的最小值、最大值、值總和
nums = [1,2,3,4,5] print(min(nums)) print(max(nums)) print(sum(nums))
列印結果:
1
5
15
列表解析
以下代碼為1-10這10個數字,按2步長取值,也就是1,3,5,7,9這五個數,每個數的平方組成一個列表
nums = [] for value in range(1,11,2): nums.append(value**2) print(nums)
列印結果:
[1, 9, 25, 49, 81]
下麵用列表解析的特性來進行改寫
nums = [value**2 for value in range(1,11,2)] print(nums)
雖然說列表解析的寫法對初學者來說不易閱讀,但是由於代碼量少,在老手眼裡反倒覺得這種寫法簡單直接,所以閱讀到別人寫的代碼的時候,有時候會看到這種寫法。
切片
切左切右切中間
除了使用索引來訪問單個元素之外,還可以使用切片來訪問指定範圍內的元素
訪問第2,3,4三個元素:
word = ['a','b','c','d','e','f'] print(word[1:4])
列印結果:
['b', 'c', 'd']
冒號前為開始切的索引,冒號後為結束的索引,但是不包含這個結束位置的元素。
如果你沒有指定開始索引,那麼切片將從0開始
列印前3個元素:
word = ['a','b','c','d','e','f'] print(word[:3])
列印結果:
['a', 'b', 'c']
同樣的如果沒有指定結束索引,那麼切片將切到列表最後
列印第4個元素到最後:
word = ['a','b','c','d','e','f'] print(word[3:])
列印結果:
['d', 'e', 'f']
也可以使用負數
列印最後三個元素
word = ['a','b','c','d','e','f'] print(word[-3:])
列印結果:
['d', 'e', 'f']
猜一猜:如果-3改成-13,結果會如何呢?
切整個列表
切整個列表實際上得到的內容就是列表本身,一般是複製列表的時候會這麼做。
word = ['a','b','c','d','e','f'] word2 = word[:] print(word2)
列印結果:
['a', 'b', 'c', 'd', 'e', 'f']
帶著步長切
切片預設的步長為1,所以切片範圍是包含了所有元素,然而我們可以顯式的指定步長。
從3到15,每3個元素切一個:
nums = list(range(0,20)) print(nums[3:16:3])
列印結果:
[3, 6, 9, 12, 15]
切全部,每2個切一個元素:
word = ['a','b','c','d','e','f'] print(word[::2])
列印結果:
['a', 'c', 'e']
切全部,每2個切一個元素,倒著切:
word = ['a','b','c','d','e','f'] print(word[::-2])
列印結果:
['f', 'd', 'b']
步長可以為負數,但是不能為0,步長為0就沒法移動了。
列表運算
加法
兩列表相加,其實就是兩列表拼接,在上文講合併列表的時候已經有提過。
list1 = ['a','b','c'] list2 = ['d','e','f'] print(list1 + list2)
列印結果:
['a', 'b', 'c', 'd', 'e', 'f']
兩列表相加等於兩列表拼接,兩字元串相加等於兩字元串拼接,但是字元串是不能和列表相加的。
乘法
將列表與一個整數x相乘,將返回一個原列表重覆x次的新列表(如果x=0,那麼將返回空列表)。
list1 = ['a','b','c'] print(list1 * 3)
列印結果:
['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
字元串也可以這麼玩:
name = 'abc' print(name * 3)
列印結果:
abcabcabc
成員資格
檢查一個值是否包含在列表中,可以使用運算符in,這是一個布爾運算符。
words = ['a','b','c','d'] if('c' in words): print('包含c')
列印結果:
包含c
如果要檢查沒有包含在列表中呢?用not來判斷:
words = ['a','b','c','d'] if(not 'xxx' in words): print('這個xxx是沒有的')
列印結果:
這個xxx是沒有的
我們不僅可以檢查列表,還可以檢查字元串中是否包含某個字元串
words = 'abcdefg' if('bc' in words): print('這個字元串包含了bc')
列印結果:
這個字元串包含了bc
結語
本文涵蓋了python列表的大部分常用知識點,還有一些其他操作比如clear(),copy(),index()等並未加以列出,感興趣的朋友可以自行拓展。