日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

python列表元素交换位置_python删除列表元素5种方法,你会的是错误法还是最优解?...

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python列表元素交换位置_python删除列表元素5种方法,你会的是错误法还是最优解?... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

刪除列表元素很多同學想當然的認為不就是循環遍歷加上if判斷再del嗎?真的有這么簡單嗎?

還是直接上代碼看案例吧:

import time# 刪除下面列表中所有張姓元素,輸出的結果應該是['李老大','李老二']lst = ['張老大', '張老二', '李老大', '張老三', '李老二']*10000# 直接for循環遍歷列表,remove需要刪除的元素def del1(lst):    for i in lst:        if i[0] == '張':            lst.remove(i)  # 在刪lst[0]'張老大'的時候,列表長度變成4,導致lst[1]取值成了'李老大',跳過了'張老二'    return lst  # 返回的結果不符合預期# 正向遍歷,通過建一個原列表的副本,然后遍歷副本,刪除原列表中的元素def del2(lst):    lst2 = lst.copy()  # 創建副本內存和時間開銷大    for i in lst2:        if i[0] == '張':            lst.remove(i)  # 刪除第一個匹配的元素,檢索匹配時間開銷大    return lst  # 結果雖然正確,但效率極低,不要用這種方法# 使用高階函數filter方法def del3(lst):    def comp(n):  # 創建過濾函數        return n[0] != '張'  #對于首字符不是'張'的元素返回True,予以保留。若返回False的予以刪除。    return list(filter(comp, lst))  # filter高階函數刪除列表中的元素,#  刪除條件是comp方法,返回的是迭代器,需要list方法轉成列表# 倒序刪除法def del4(lst):    for i in range(len(lst) - 1, -1, -1):  # 注意len(lst)必須-1,因為列表元素下標是0至len(lst)-1;# 時刻謹記for循環左開右閉,從lst隊尾循環到開頭必須是-1,寫0會漏了lst[0];-1表示倒序排列。# range實際就是int數字列表生成式,在這生成的是[49999,49998,..1,0],通過下標訪問列表的指定元素。        if lst[i][0] == '張':            del lst[i]    return lst# 倒序刪除之while循環,效果和for序號一致,運行效率差別極其微小(for序號方法內存開銷略大一點點)。# while循環代碼要寫7行,for循環只要5行,更推薦使用for循環。但while循環代碼閱讀起來更易懂。def del5(lst):    length = len(lst) - 1    while length >= 0:        if lst[length][0] == '張':            del lst[length]        length -= 1    return lst # lst = del1(lst)  # del1方法直接遍歷列表刪除指定元素,返回結果錯誤# print(lst)# t1 = time.time()# lst = del2(lst)  # del2方法通過創建列表副本,遍歷副本刪除原件中的指定元素,結果正確,但效率極低# t2 = time.time()# print(f"遍歷方法刪除元素用時:{t2 - t1:.5f}")  # 4.51529,在這可以看到代碼優化的必要性。t1 = time.time()lst = del3(lst)t2 = time.time()print(f"filter方法刪除元素用時:{t2 - t1:.5f}")  # 0.00596,最優解,性能最佳,消耗內存最少。# t1 = time.time()# lst = del4(lst)# t2 = time.time()# print(f"遍歷方法刪除元素用時:{t2 - t1:.5f}")  # 0.07991,次優解,自己循環遍歷更靈活。# t1 = time.time()# lst = del5(lst)# t2 = time.time()# print(f"遍歷方法刪除元素用時:{t2 - t1:.5f}")  # 0.08516,次優解,自己循環遍歷更靈活。

以上案例注釋非常詳細,初學者可以認真閱讀與思考。其中del4()for循環和del5()while循環時間消耗幾乎一致,for循環內存消耗略大一點點。for循環可以比while循環少寫2行代碼,學python自然要學簡潔的寫法,在同樣性能指標下代碼行數越少越好,寫循環優先用for。

另外提一句,使用filter高階函數運行速度是for或while的13-15倍,因為filter實際執行的是c代碼。在python中有很多內置方法實際是c代碼,用好了會大大提高運行效率。雖然python是公認的開發效率高運行效率低,但是只要針對運算量極大的循環執行代碼塊進行恰當優化(通常就是使用這種c代碼的內置方法,有能力的也可以自定義c代碼方法,或者是第三方的c代碼方法),python性能并不弱多少,而開發效率提升很多,所以python會這么流行。

編寫代碼首先要避免bug,多做測試檢查運行結果是否符合預期。其次要注重代碼性能(無bug的代碼才考慮改進算法提高性能,有bug的代碼0性能),代碼性能一般看2個指標,1是時間消耗,2是資源消耗(通常指內存消耗,特殊場合還有別的資源消耗)。

在學習python的路上,大家一起加油吧,有空也可以逛逛我的博客園,我會堅持每天更新。

https://www.cnblogs.com/fz17/

總結

以上是生活随笔為你收集整理的python列表元素交换位置_python删除列表元素5种方法,你会的是错误法还是最优解?...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。