基于Python中Remove函數(shù)的用法討論
前幾天在進(jìn)行寫程序時碰到這樣一個問題
a=[’a’,’b’,’c’,’d’]
b=[’c’,’d’,’e’,’f’]
需要將數(shù)組a中元素,在數(shù)組b中出現(xiàn)過都刪除。第一次寫出程序如下:
a=[’a’,’b’,’c’,’d’]b=[’c’,’d’,’e’,’f’]for x in a: if x in b: a.remove(x)print (a)
最后的輸出結(jié)果為
出現(xiàn)這樣的結(jié)果,當(dāng)時感覺很詫異。但立馬細(xì)細(xì)一想,立馬明白了其中的原因。
當(dāng)x=’c’時,此時滿足if條件語句,執(zhí)行if下的語句:a.remove(x),也就是將’c’元素從a數(shù)組中刪除。
刪除之后,remove函數(shù)并沒有執(zhí)行結(jié)束。而是將a數(shù)組中索引號大于刪除元素索引號的所有元素依次前一位。
此時,x指向a[2],a數(shù)組當(dāng)前的狀態(tài)為:[’a’,’b’,’d’],a[2]中存儲的為元素’d’。
remove函數(shù)返回后,繼續(xù)執(zhí)行for循環(huán),x指向數(shù)組的下一個索引。
因此導(dǎo)致了’d’元素沒有與數(shù)組b進(jìn)行比較。
后續(xù),將程序進(jìn)行了如下修改:
a=[’a’,’b’,’c’,’d’]c=[’a’,’b’,’c’,’d’]b=[’c’,’d’,’e’,’f’] for x in a: if x in b: c.remove(x)print (c)
程序運行結(jié)果如下:
雖然問題不是很難,但是這個細(xì)節(jié)問題一定要把握。
補(bǔ)充知識:Python列表的remove方法的注意事項
為何沒有刪除列表中的全部元素?
解釋:
按照執(zhí)行順序,第一個空格被刪除之后,后面的元素會前移(變成[’空格’,’空格’,’12’,’23’]),指針下一次會指向新列表的第二個元素(即初始狀態(tài)的第三個空格),從而初始狀態(tài)的第二個空格被跳過了,初始第三個空格被刪除,接著后面的元素又再次前移(變成[’空格’,’12’,’23’]),指針指向新列表的第三個元素,即初始狀態(tài)的第5個元素23,然后23被刪除了,因此只剩下[’空格’,’12’]
如果想排除初始列表中的部分元素,如何實現(xiàn)?
由上面的情況知道,在遍歷列表的同時對列表執(zhí)行刪除操作,會造成意外的結(jié)果,那么對初始列表進(jìn)行遍歷,對初始的列表的副本執(zhí)行刪除操作呢?
以上結(jié)果顯示,沒有得到預(yù)期效果。為什么?
問題出在copy=ls這一句,這里僅僅是使得copy與ls指向了同一片內(nèi)存(即淺拷貝,shallow copy),并沒有執(zhí)行【開辟一片新內(nèi)存,并且ls內(nèi)存中的內(nèi)容復(fù)制到新內(nèi)存,然后使copy指向新開辟的內(nèi)存,即深拷貝,deep copy】這一系列操作。因此對copy執(zhí)行的remove操作,和對遍歷ls列表,實質(zhì)上還是都是針對同一片內(nèi)存進(jìn)行操作,因此結(jié)果上一個例子類似。
若想解決這一問題,有3個辦法法:
(1)
ls=[’ ’,’ ’,’ ’,’12’,’23’,’abc’,’aa’]
copy=[’ ’,’ ’,’ ’,’12’,’23’,’abc’,’aa’]
這一辦法對于已知列表的所有元素,且元素數(shù)量較少,結(jié)構(gòu)較簡單時可行,其他情況下不可行。
(2)引入copy模塊的deepcopy方法:
Python列表的remove方法的注意事項
(3)另外準(zhǔn)備一個空列表,遍歷初始列表時,將符合條件的元素逐一加入到空列表當(dāng)中(利用列表的append方法)。
這種方法,思路上與remove方法相反,但執(zhí)行的操作差不多,時間復(fù)雜度也與remove方法差不多,無需引入copy模塊。
另外,對于列表的remove方法,python基礎(chǔ)教程第二版給出的說明是:
remove方法用于移除列表中某個值的第一個匹配項:
>>>x=[’to’,’be’,’or’,’not’,’to’,’be’]>>>x.remove(’be’)>>>x[’to’,’or’,’not’,’to’,’be’]
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方歡迎留言討論,望不吝賜教。
相關(guān)文章:
1. 用xslt+css讓RSS顯示的跟網(wǎng)頁一樣漂亮2. ASP.NET MVC把數(shù)據(jù)庫中枚舉項的數(shù)字轉(zhuǎn)換成文字3. 《CSS3實戰(zhàn)》筆記--漸變設(shè)計(一)4. 測試模式 - XSL教程 - 55. Ajax實現(xiàn)異步加載數(shù)據(jù)6. 教你JS更簡單的獲取表單中數(shù)據(jù)(formdata)7. ASP.NET Core自定義中間件的方式詳解8. html5手機(jī)觸屏touch事件介紹9. CSS3實現(xiàn)動態(tài)翻牌效果 仿百度貼吧3D翻牌一次動畫特效10. 讓chatgpt將html中的圖片轉(zhuǎn)為base64方法示例
