刪除list元素的方法-創(chuàng)新互聯(lián)

小編給大家分享一下刪除list元素的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),武義企業(yè)網(wǎng)站建設(shè),武義品牌網(wǎng)站建設(shè),網(wǎng)站定制,武義網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,武義網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

先來看一段代碼:

# Delete elements from a list
def remove_list(li,drop_list):
    for i in li:
        inx = li.index(i)
        if i in drop_list:
            del li[inx]
    print(li)

li1 = [1, 2, 2, 2, 3]
drop_list = [2]
remove_list(li, drop_list)

> [1, 2, 3]

這段代碼并沒有把所有“2”刪除掉,為了發(fā)現(xiàn)它二在哪里,繼續(xù)舉兩個(gè)例子。

# Delete a2 & a3
li2 = ["a1", "a2", "a3", "a4", "a5", "a6", "a7"]
drop_list = ["a2", "a3"]
remove_list(li, drop_list)

> ['a1', 'a3', 'a4', 'a5', 'a6', 'a7']

#Delete all the list
li3 = ["a1", "a2", "a3", "a4", "a5", "a6", "a7"]
drop_list = ["a1", "a2", "a3", "a4", "a5", "a6", "a7"]
remove_list(li, drop_list)

> ['a2', 'a4', 'a6']

這下問題清楚了,但凡相連元素的刪除,后面的那個(gè)元素總是能風(fēng)騷走位。所以很明顯,是因?yàn)閯h除的過程中,刪除了前一個(gè)元素后,整個(gè)列表會(huì)整體前移,索引值發(fā)生了改變,導(dǎo)致緊隨其后的元素在接下來的遍歷中無法被檢索。

解決方案:

上面其實(shí)出現(xiàn)了兩個(gè)問題,分別是刪除相同的所有元素及刪除兩個(gè)相鄰的元素,解決的思路也稍有不同。

刪除同一元素

1、可以使用while和remove的組合

while 2 in li1:
    li1.remove(2)
print(li1)

> [1, 3]


# 2、倒序遍歷法
for i in li1[::-1]:
    if i == 2:
        li1.remove(i)
print(li1)

> [1, 3]

刪除相鄰元素

1、列表解析

new_li2 = [i for i in li2 if i != "a2" or i != "a3"]
print(new_li2)

> ['a1', 'a4', 'a5', 'a6', 'a7']


# 2、使用filter
new_li2 = filter(lambda i: i != "a2" or i != "a3", li2)
print(list(new_li2))

> ['a1', 'a4', 'a5', 'a6', 'a7']


# 3、一次遍歷創(chuàng)建新表
new_li2 = []
for i in li2:
    if i != "a2" or i != "a3":
        new_li2.append(temp)
print(list(new_li2))

> ['a1', 'a4', 'a5', 'a6', 'a7']

其實(shí)可以看到,在這個(gè)例子中,i!="a2" or i!="a3"i !=" a 2 " \text { or } i !=" a 3 "i!="a2" or i!="a3"是最關(guān)鍵的解析式,如果我們對解析式進(jìn)行修改,那么就可以刪除多個(gè)元素了。

new_li3 = []
for i in li3:
    if i not in ["a1", "a2", "a3", "a4", "a5", "a6", "a7"]:
        new_li3.append(temp)
print(list(new_li3))

> []

小結(jié)

使用while或倒序循環(huán)的方法,可以刪除同一元素,而使用其他幾種方法,可以刪除任意元素,包括相鄰的元素。如果這些元素還具有其它特征,那可能會(huì)有其它更簡便的方法,比如使用itertools庫之類的。

pop、del與remove

最后順便說說列表中的這三個(gè)針對單個(gè)元素的刪除方法。上面重復(fù)用到的是remove,一開始寫的代碼也和remove的思路幾乎一致。但是這三個(gè)方法還是有一點(diǎn)區(qū)別的。

li4 = [1, 2, "a1", "a2", "a1"]

# 使用del語句可以刪除任何位置處的列表元素,條件是知道索引
print(del li4[2])

> [1, 2, "a2", "a1"]

# pop是列表自帶的方法,和del幾乎一樣,缺省值意味刪除最后一個(gè)元素,也需要知道索引
print(li4.pop())
print(li4.pop(2))

> [1, 2, "a1", "a2"]
> [1, 2, "a2", "a1"]

# remove針對不知道元素在列表中的位置,但知道元素的值的情形,但對于多個(gè)相同的元素,只能刪除第一個(gè)
# 使用上面說的while就可以刪除多個(gè)相同元素
print(li4.remove("a1"))
print((li4.remove("a1")).remove("a1"))

> [1, 2, "a2", "a1"]
> [1, 2, "a2"]

刪除列表中指定元素時(shí),最好不要用 for 循環(huán)(或本質(zhì)就是for循環(huán)的一切內(nèi)容),刪除不當(dāng)實(shí)際上是一個(gè)非常危險(xiǎn)的bug,實(shí)際開發(fā)中,如果應(yīng)該被刪除但是卻被漏掉的垃圾會(huì)不斷累積直到造成內(nèi)存溢出。上面提供的方法應(yīng)該可以解決大部分的情形了。

看完了這篇文章,相信你對刪除list元素的方法有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!

文章標(biāo)題:刪除list元素的方法-創(chuàng)新互聯(lián)
本文鏈接:http://muchs.cn/article26/dcjjjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、小程序開發(fā)網(wǎng)站內(nèi)鏈、網(wǎng)站收錄、做網(wǎng)站品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司