列表
特點:有序峰弹,長度可變,且包含的內容均可修改的序列散怖,即支持增刪改查
列表的創(chuàng)建:
創(chuàng)建列表可以采用如下幾種方式:
(1)使用方括號:lst = [1,2,4,True, None]
(2)使用元組來創(chuàng)建:list(tuple)
(3)使用迭代器/生成器:list(range(10)), range(0,10,3)
(3.1.) 列表生成器range麦锯,前開后閉,生成的都是整數(shù)晾蜘,range雖然不是一個列表,但是它能像列表一樣被索引
lst1 = [1,2,4,True, None]
tup = (8, 9 , 13, 'hello')
lst2 = list(tup)
ran = range(1, 10)
lst3 = list(ran)
print(lst1, type(lst1))
print(lst2, type(lst2))
print(ran, type(ran))
print(lst3, type(lst3))
-----------------------------------
[1, 2, 4, True, None] <class 'list'>
[8, 9, 13, 'hello'] <class 'list'>
range(1, 10) <class 'range'>
[1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>
增刪元素
列表是有序可變的序列浑吟,那么它必然會支持增刪改查:
(1)增
- 使用+進行列表的連接,此時會產生一個新的列表耗溜,不會改變原始列表
list+[1,2,3]:生成一個新的list组力,不會改變lst
lst1 = list(range(9))
print(lst1)
lst2 = lst1 + [99, 88, 77]
print(lst1)
print(lst2)
--------------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 99, 88, 77]
- 使用list.append(value/list)方法,在列表的末尾進行插入抖拴,此時會在原始列表的末尾進行元素的添加
list.append(element/lst)
lst1 = list(range(9))
print(lst1)
lst1.append([99, 88, 77])
print(lst1)
---------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, [99, 88, 77]]
- 使用list.extend(list)方法燎字,在列表中同時添加多個元素,該方法與上述append方法的主要區(qū)別在于阿宅,append會在原始列表末尾直接插入一個新添的列表候衍,而extend是直接在末尾添加多個元素,該方法與“+”的區(qū)別在于不會產生新的列表洒放,直接在原始列表上進行修改蛉鹿。
list.extend([1,23,4])
lst1 = list(range(9))
print(lst1)
lst1.extend([99, 88, 77])
print(lst1)
---------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 99, 88, 77]
- 使用list.insert(index, value)在對應的位置index上插入對應的值value
list.insert(3, 'world'):在index為3的位置插入'world'
lst = [5,9, 3, 'hello']
print(lst)
lst.insert(3, 'world')
print(lst)
---------------------------
[5, 9, 3, 'hello']
[5, 9, 3, 'world', 'hello']
(2)刪
- list.pop(index):將特定位置index的元素移除
lst = list(range(7))
print(lst)
print(lst.pop())
print(lst)
------------------------
[0, 1, 2, 3, 4, 5, 6]
6
[0, 1, 2, 3, 4, 5]
- list.remove(value):定位第一個符合要求的值/value并移除
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print(lst)
print(lst.remove('red'))
print(lst)
---------------------------------
[55, 88, 4, 4, 'red', 'yellow', 'red']
None
[55, 88, 4, 4, 'yellow', 'red']
- list.clear():清除所有的元素
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print(lst)
print(lst.clear())
print(lst)
----------------------------------------
[55, 88, 4, 4, 'red', 'yellow', 'red']
None
[]
- del list[0]:del是一個語句,刪除了第一個元素往湿; del lst[:4]
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print(lst)
del lst[:4]
print(lst)
-------------------------------------
[55, 88, 4, 4, 'red', 'yellow', 'red']
['red', 'yellow', 'red']
(3)改查
列表的修改比較簡單妖异,通過索引的方式直接修改列表中對應的元素
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print(lst)
lst[4] = 'black'
print(lst)
--------------------------------------
[55, 88, 4, 4, 'red', 'yellow', 'red']
[55, 88, 4, 4, 'black', 'yellow', 'red']
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print(lst[3:])
-------------------------------
[4, 'red', 'yellow', 'red']
列表連接和聯(lián)合
列表的連接與聯(lián)合主要有如下兩種方式:
(1)+連接:兩個列表直接用+進行連接
(2)lst1.extend(lst2):extend方法向該列表中添加多個元素
由于在列表的增這個部分已經介紹過這兩種方式的使用惋戏,此處不再詳贅述,這里主要提出一個值得關注的點:
使用+添加內容來連接列表代價比較高他膳,過程中創(chuàng)建了新列表响逢,并且還要復制對象。通常使用extend將元素添加到已經存在的列表是更好的一種方式棕孙。
成員運算
可以使用in, not in檢查某個值是否在/不在列表中舔亭,返回值為布爾型。
(1)in:檢查一個值是否在列表中
(2)not in:判斷元素不在列表中
與字典和集合相比蟀俊,檢查列表中是否包含一個值是非常緩慢的钦铺,因為python在檢查時
- 列表:會進行線性逐個掃描
- 字典與集合:同時檢查所有元素,基于哈希表**
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print('red' in lst)
print('yellow' not in lst)
-------------------------------
True
False
列表的函數(shù)與方法
(1)函數(shù):列表的函數(shù)有很多欧漱,此處不詳細展開职抡,需要使用的時候可以直接百度搜
len(lst)
max(lst)
min(lst)
sum(lst)
(2)方法
- list.index(element):返回元素對應的index,注意它返回的是查到的第一個元素的index
- list.count(element):計算元素出現(xiàn)的個數(shù)
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print(lst.index('red')) >>> 4
print(lst.count('red')) >>> 2
- list.sort():對列表的元素進行排序
a = [88,11,4,56,100]
a.sort()
print(a)
b = ['saw', 'small','foxes']
b.sort(key=len)
print(b)
----------------------------------------
[4, 11, 56, 88, 100]
['saw', 'small', 'foxes']
列表的排序
上述提及列表的排序方法误甚,此處我們介紹列表常用的幾種排序方式:
(1)list.sort()方法:列表內部進行排序缚甩,無需創(chuàng)建新對象
(2)sorted(list)函數(shù):對通用序列產生一個排序后的拷貝,排序并復制的一個函數(shù)
lst = ['foo', 'red', 'yellow', 'black']
sorted(lst, key = len, reverse=True)
----------------------------------------------
['yellow', 'black', 'foo', 'red']
(3)bisect:內建的bisect模塊實現(xiàn)了二分搜索和已排序列表的插值窑邦,但是bisect不會檢查列表是否已經排序擅威,因為這樣代價太大
bisect.bisect(lst, 2):找到元素應當被插入的位置
bisect.insort(lst,6):將元素插入到相應位置
import bisect
lst = ['foo', 'red', 'yellow', 'black']
print(bisect.bisect(lst, 'yellow'))
print(lst)
print(bisect.insort(lst, 'black'))
print(lst)
----------------------------------------
4
['foo', 'red', 'yellow', 'black']
None
['black', 'foo', 'red', 'yellow', 'black']
列表的復制
這里介紹列表一個非常重要的用法,在python中會存在列表的賦值冈钦,但是賦值之后郊丛,如果修改其中一個列表的元素, 勢必也會更給另一個列表中的元素瞧筛,這是因為賦值意味著兩個列表的引用是一樣的厉熟,這個跟python內部序列的存儲有關。例如:
x = list(range(5))
m = x
x[2] = 101
此時會發(fā)現(xiàn)m[2]
對應的值也會發(fā)生改變较幌,這就是需要復制的原因揍瑟。
- list.copy():復制一個新的列表,此時list與復制出來的list指向兩個新的列表(雖然兩個列表的值相同)
lst_old = ['foo', 'red', 'yellow', 'black']
lst_new = lst.copy()
print(lst_old)
print(lst_new)
lst_old[0] = 'foolish'
print(lst_old)
print(lst_new)
-----------------------------------------
['foo', 'red', 'yellow', 'black']
['foo', 'red', 'yellow', 'black']
['foolish', 'red', 'yellow', 'black']
['foo', 'red', 'yellow', 'black']
切片
切片創(chuàng)建:
- 使用列表來創(chuàng)建切片:注意切片的索引是左閉右開
list[3:5]
切片賦值
seq[3:4] = [66,77]
切片取值
seq[:-1]
seq[-4:]
seq[:]
seq[::2]:表示每隔2個數(shù)取一個值乍炉,其中2為步長
對列表或者元組進行翻轉/逆序排列
對元組或者列表進行逆序排列可以采用如下兩種方式:
(1)lst[::-1]
lst = ['foo', 'red', 'yellow', 'black']
print(lst)
lst[::-1]
--------------------------
['foo', 'red', 'yellow', 'black']
['black', 'yellow', 'red', 'foo']
(2)reversed(list)函數(shù)绢片,但是此時返回的是一個迭代器,我們需要再使用list()函數(shù)將其轉換成列表
lst = ['foo', 'red', 'yellow', 'black']
print(lst)
print(reversed(lst), type(reversed(lst)))
list(reversed(lst))
-----------------------------------------------
['foo', 'red', 'yellow', 'black']
<list_reverseiterator object at 0x0000022B0DFE5D48> <class 'list_reverseiterator'>
['black', 'yellow', 'red', 'foo']