列表與切片

列表

特點:有序峰弹,長度可變,且包含的內容均可修改的序列散怖,即支持增刪改查

列表的創(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']
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末岛琼,一起剝皮案震驚了整個濱河市底循,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌槐瑞,老刑警劉巖熙涤,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡灭袁,警方通過查閱死者的電腦和手機猬错,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茸歧,“玉大人倦炒,你說我怎么就攤上這事∪硐梗” “怎么了逢唤?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涤浇。 經常有香客問我鳖藕,道長,這世上最難降的妖魔是什么只锭? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任著恩,我火速辦了婚禮,結果婚禮上蜻展,老公的妹妹穿的比我還像新娘喉誊。我一直安慰自己,他們只是感情好纵顾,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布伍茄。 她就那樣靜靜地躺著,像睡著了一般施逾。 火紅的嫁衣襯著肌膚如雪敷矫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天汉额,我揣著相機與錄音曹仗,去河邊找鬼。 笑死蠕搜,一個胖子當著我的面吹牛怎茫,可吹牛的內容都是我干的。 我是一名探鬼主播讥脐,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼遭居,長吁一口氣:“原來是場噩夢啊……” “哼啼器!你這毒婦竟也來了旬渠?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤端壳,失蹤者是張志新(化名)和其女友劉穎告丢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體损谦,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡岖免,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年岳颇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颅湘。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡话侧,死狀恐怖,靈堂內的尸體忽然破棺而出闯参,到底是詐尸還是另有隱情瞻鹏,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布鹿寨,位于F島的核電站新博,受9級特大地震影響,放射性物質發(fā)生泄漏脚草。R本人自食惡果不足惜赫悄,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馏慨。 院中可真熱鬧埂淮,春花似錦、人聲如沸熏纯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽樟澜。三九已至误窖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秩贰,已是汗流浹背霹俺。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毒费,地道東北人丙唧。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像觅玻,于是被迫代替她去往敵國和親想际。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355