Python List列表對(duì)象內(nèi)置方法實(shí)例詳解
本文實(shí)例講述了Python List列表對(duì)象內(nèi)置方法。分享給大家供大家參考,具體如下:
前言
在上一篇中介紹了Python的序列和String類(lèi)型的內(nèi)置方法,本篇繼續(xù)學(xué)習(xí)作為序列類(lèi)型成員之一的List類(lèi)型的內(nèi)置方法。
軟件環(huán)境
- 系統(tǒng)
- UbuntuKylin 14.04
- 軟件
- Python 2.7.3
- IPython 4.0.0
列表List
列表是一種容器,存放內(nèi)存對(duì)象的引用。即是任意內(nèi)存對(duì)象的有序集合,不同的類(lèi)型對(duì)象可以存放在同一個(gè)列表中。通過(guò)索引來(lái)訪(fǎng)問(wèn)其中的元素??梢匀我獾那短?、伸長(zhǎng)、異構(gòu)、為可變數(shù)據(jù)類(lèi)型,支持原處修改列表內(nèi)部元素的引用。
修改列表的元素
In [130]: li = ['my','name','is','Jmilk'] In [131]: li[3] = 'new' In [132]: li Out[132]: ['my', 'name', 'is', 'new']
插入列表元素
插入的元素也可以是序列等任意類(lèi)型
In [133]: li.append('list')
In [134]: li
Out[134]: ['my', 'name', 'is', 'new', 'list']
extend() 將序列中的元素迭代的附加到list中
L.extend(iterable) – extend list by appending elements from the iterable
注意:是將iterable中的元素迭代的添加到List中,成為L(zhǎng)ist的元素,而不是將整個(gè)iterable成為L(zhǎng)ist中的一個(gè)元素。這與append()方法是有本質(zhì)的區(qū)別的。
extend():
In [157]: li.extend(tp) In [158]: li Out[158]: ['my', 'name', 'is', 'Jmilk', 'a', 'b', 'c']
append():
In [166]: li = ['my','name','is','Jmilk'] In [167]: li2 Out[167]: ['hey', 'chocolate'] In [168]: li.append(li2) In [169]: li Out[169]: ['my', 'name', 'is', 'Jmilk', ['hey', 'chocolate']]
insert() 在指定的索引號(hào)中插入一個(gè)元素
L.insert(index, object) – insert object before index
在指定的原index之前插入一個(gè)元素
In [172]: li.insert(4,'and') In [173]: li Out[173]: ['my', 'name', 'is', 'Jmilk', 'and', ['hey', 'chocolate']]
可以插入任意類(lèi)型對(duì)象,但只會(huì)插入一個(gè)元素,index后的元素依次后挪一位。
刪除列表元素
同時(shí)結(jié)合切片操作符。
注意:這中刪除元素的方法只有列表類(lèi)型適用
In [135]: li[3:] = [] In [136]: li Out[136]: ['my', 'name', 'is']
del() 刪除List中的元素
In [146]: li Out[146]: ['my', 'name', 'is'] In [147]: del(li[1:]) In [148]: li Out[148]: ['my']
pop() 彈出List中的一個(gè)元素
L.pop([index]) -> item – remove and return item at index (default last).
Raises IndexError if list is empty or index is out of range.
將List中的一個(gè)指定index的元素彈出(默認(rèn)為最后一個(gè)元素),并返回一個(gè)value,可以賦值給變量。當(dāng)List為空或指定的索引超出List長(zhǎng)度時(shí),會(huì)觸發(fā)一個(gè)indexError。
In [183]: li Out[183]: ['My', 'name', 'is', 'Jmilk'] In [184]: name = li.pop() In [185]: name Out[185]: 'Jmilk'
remove() 刪除List中一個(gè)指定Value的元素
L.remove(value) – remove first occurrence of value.
Raises ValueError if the value is not present.
刪除List中第一個(gè)指定的Value的元素,不會(huì)返回一個(gè)Value。與del()的使用方法不同,remove()是通過(guò)value來(lái)決定刪除的元素,而不是通過(guò)index來(lái)決定。
In [192]: li
Out[192]: ['My', 'name', 'is', 'Jmilk', 'Jmilk']
In [193]: li.remove('Jmilk')
In [194]: li
Out[194]: ['My', 'name', 'is', 'Jmilk']
排序列表元素
sort() 正向排序
L.sort(cmp=None, key=None, reverse=False) – stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1
List內(nèi)建愛(ài)呢的sort()函數(shù),跟序列類(lèi)型的內(nèi)建愛(ài)呢函數(shù)sorted()有著非常相似的地方。
一樣擁有key()、cmp()函數(shù)和reverse缺省參數(shù),用法也基本相同。但是兩者之間還是有著本質(zhì)的差別,如下:
1. L.sort()函數(shù)只支持List類(lèi)型對(duì)象,而sorted()函數(shù)支持所有的iterable迭代器類(lèi)型。
2. L.sort()會(huì)改變?cè)嫉腖ist對(duì)象,返回值為None。而sotred()函數(shù)不會(huì)修改原始iterable,會(huì)返回一個(gè)新的List。
在上一篇中有sorted()函數(shù)的詳細(xì)介紹,傳送門(mén):http://www.dbjr.com.cn/article/172487.htm
In [231]: li
Out[231]: [('a', 3), ('b', 2), ('c', 1)]
In [232]: li.sort(key = lambda x:x[1])
In [233]: li
Out[233]: [('c', 1), ('b', 2), ('a', 3)]
Operator Module支持排序
Operator模塊中的itemgetter, attrgetter兩個(gè)方法可以有效的支持L.sort()、sorted()兩種排序方法。
itemgetter:
itemgetter(item, …) –> itemgetter object
Return a callable object that fetches the given item(s) from its operand.
After f = itemgetter(2), the call f(r) returns r[2].
After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])
從操作數(shù)中獲取一個(gè)由index索引指定的item,并返回一個(gè)可被調(diào)用的對(duì)象。
attrgetter:與itemgetter的用法類(lèi)似,區(qū)別在于使用指定的value來(lái)指定要獲取的attribute。
下面做一個(gè)比較:
sorted():
In [239]: li
Out[239]: [('c', 1), ('b', 2), ('a', 3)]
In [240]: sorted(li,key = lambda x:x[1])
Out[240]: [('c', 1), ('b', 2), ('a', 3)]
L.sort():
In [241]: li.sort(key = lambda x:x[1])
In [242]: li
Out[242]: [('c', 1), ('b', 2), ('a', 3)]
operator.itemgetter():
In [251]: li
Out[251]: [('a', 3), ('b', 2), ('c', 1)]
In [252]: sorted(li,key = itemgetter(1))
Out[252]: [('c', 1), ('b', 2), ('a', 3)]
除此之外operator模塊能夠?qū)崿F(xiàn)多級(jí)排序:
In [256]: sorted(li,key = itemgetter(0,1))
Out[256]: [('a', 3), ('b', 2), ('c', 1)]
In [257]: sorted(li,key = itemgetter(0,1))
Out[257]: [('a', 3), ('b', 2), ('c', 1)]
In [258]: li = [('a', 3), ('a', 2), ('a', 1)]
In [259]: sorted(li,key = itemgetter(0,1))
Out[259]: [('a', 1), ('a', 2), ('a', 3)]
在以tuple_index=0作為關(guān)鍵字無(wú)法實(shí)現(xiàn)排序后,會(huì)自動(dòng)的使用tuple_index=1作為關(guān)鍵字排序。
另一種多級(jí)排序的方法:
In [327]: li = [('a', 3), ('b', 2), ('c', 1)]
In [328]: li.sort(key = lambda x:(x[0],x[1]))
In [329]: li
Out[329]: [('a', 3), ('b', 2), ('c', 1)]
In [330]: li = [('a', 3), ('a', 2), ('a', 1)]
In [331]: li.sort(key = lambda x:(x[0],x[1]))
In [332]: li
Out[332]: [('a', 1), ('a', 2), ('a', 3)]
reverse() 逆向排序
始終與當(dāng)前順序逆向,默認(rèn)tuple_index=0為優(yōu)先排序。
In [263]: li.reverse()
In [264]: li
Out[264]: [('c', 1), ('b', 2), ('a', 3)]
In [265]: li.reverse()
In [266]: li
Out[266]: [('a', 3), ('b', 2), ('c', 1)]
count() 統(tǒng)計(jì)元素在list中出現(xiàn)的次數(shù)
L.count(value) -> integer – return number of occurrences of value
In [151]: li
Out[151]: ['my', 'name', 'is', 'Jmilk']
In [153]: li.count('my')
Out[153]: 1
List的深Copy和淺Copy
下面先看一個(gè)例子:
In [299]: li1 = [1,2,3,4] In [300]: li2 = li1 In [301]: li1.append(5) In [302]: li1,li2 Out[302]: ([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])
可以看出,對(duì)li1的操作會(huì)影響到li2。實(shí)際上 li1 = li2 語(yǔ)句只是將li1的引用對(duì)象Copy給了li2,而沒(méi)有將li1的內(nèi)存對(duì)象Copy給li2。這就是List類(lèi)型的淺Copy,相對(duì)的就是深Copy。
進(jìn)行List的深Copy的方法有下面兩種:
方法一:將li1的內(nèi)存對(duì)象Copy給li2,生成一個(gè)新的List對(duì)象。
In [305]: li1 = [1,2,3,4] In [306]: li2 = li1[:] In [307]: li1.append(5) In [308]: li1,li2 Out[308]: ([1, 2, 3, 4, 5], [1, 2, 3, 4])
比較兩次賦值的區(qū)別:
In [312]: li2 = li1 In [313]: id(li1),id(li2) Out[313]: (139950315013328, 139950315013328) In [314]: li2 = li1[:] In [315]: id(li1),id(li2) Out[315]: (139950315013328, 139950314662440)
方法二:使用copy.deepcopy() 函數(shù)
deepcopy(x, memo=None, _nil=[])
Deep copy operation on arbitrary Python objects.
深Copy方法deepcopy()只對(duì)可變類(lèi)型有效,所以Tuple、String不能使用。
In [321]: import copy In [322]: li1 = [1,2,3,4] In [323]: li2 = copy.deepcopy(li1) In [324]: li1.append(5) In [325]: li1,li2 Out[325]: ([1, 2, 3, 4, 5], [1, 2, 3, 4])
最后
因?yàn)楣ぷ髟蜃罱麻_(kāi)了Linux、和powershell主題的版塊。希望可以做到即學(xué)即用,以博客來(lái)推動(dòng)學(xué)習(xí)。但是Python仍然是我最喜歡的一種語(yǔ)言,他還有些非常多有意思的地方等待我們?nèi)グl(fā)現(xiàn)。繼續(xù)努力!:)
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專(zhuān)題:《Python列表(list)操作技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python ATM功能實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Python ATM功能實(shí)現(xiàn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Python全景系列之?dāng)?shù)據(jù)類(lèi)型大盤(pán)點(diǎn)
這篇文章主要為大家介紹了Python全景系列之?dāng)?shù)據(jù)類(lèi)型的盤(pán)點(diǎn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
python實(shí)現(xiàn)對(duì)列表中的元素進(jìn)行倒序打印
今天小編就為大家分享一篇python實(shí)現(xiàn)對(duì)列表中的元素進(jìn)行倒序打印,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
networkx庫(kù)繪制帶權(quán)圖給無(wú)權(quán)圖加權(quán)重輸出
這篇文章主要為大家介紹了Python?networkx庫(kù)繪制帶權(quán)圖給無(wú)權(quán)圖加權(quán)重并輸出權(quán)重的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)
這篇文章主要介紹了Python實(shí)現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

