电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python列表去重復(fù)項(xiàng)的N種方法(實(shí)例代碼)

瀏覽:96日期:2022-07-25 17:15:29

說(shuō)明

Python語(yǔ)言中列表(List)與其他語(yǔ)言的數(shù)組(Array)類(lèi)似,是一種有序的集合數(shù)據(jù)結(jié)構(gòu),Python List可支持各種數(shù)據(jù)類(lèi)型,長(zhǎng)度也可動(dòng)態(tài)調(diào)整,與JS中的數(shù)組或Java ArrayList很接近。在實(shí)際編程中,經(jīng)常會(huì)遇到數(shù)組或列表去掉重復(fù)項(xiàng),保持成員唯一性。實(shí)現(xiàn)方式有多種,比如新建列表來(lái)存儲(chǔ)非重復(fù)項(xiàng),或者在原有基礎(chǔ)上刪除掉重復(fù)的項(xiàng),也可以利用數(shù)據(jù)結(jié)構(gòu)來(lái)達(dá)到去重復(fù)。具體哪一種方法更好呢?以下約20種方式都可以實(shí)現(xiàn),我們可以通過(guò)這些來(lái)交流和學(xué)習(xí)。

Python列表去重復(fù)項(xiàng)的N種方法(實(shí)例代碼)

方式

## 1. 新建列表,如果新列表中不存在,則添加到新列表。 def unique(data): new_list = [] for item in data: if item not in new_list: new_list.append(item) return new_list # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('new_list + not in data:', unique(data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') # result $ python -V Python 2.7.16 $ python unique.py (’for list + not in. data:’, [’a’, 1, 2, ’b’]) time:0.0441074371338 ms ## 2. 新建列表。根據(jù)下標(biāo)判斷是否存在新列表中,如果新列表中不存在則添加到新列表。 def unique(data): new_list = [] for i in range(len(data)): if data[i] not in new_list: new_list.append(data[i]) return new_list ## 2.1 新建列表,使用列表推導(dǎo)來(lái)去重。是前一種的簡(jiǎn)寫(xiě)。 def unique(data): new_list = [] [new_list.append(i) for i in data if not i in new_list] return new_list # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('for range + not in. data:', unique(data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 3. 通過(guò)index找不到該項(xiàng),則追加到新列表中。index找不到會(huì)報(bào)錯(cuò),因此放在異常處理里。 def unique(data): new_list = [] for i in range(len(data)): item = data[i] try: if (new_list.index(item) < 0): print(’new_list:’, new_list) except ValueError: new_list.append(item) return new_list # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('list index + except:', unique(data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 4. 新建列表,兩個(gè)循環(huán)。如果內(nèi)循環(huán)與外循環(huán)項(xiàng)相同,且下標(biāo)相同就添加到新列表,其余忽略 def unique(data): new_list = [] for i in range(len(data)): j = 0 while j <= i: if data[i] == data[j]: if i == j: new_list.append(data[i]) break j += 1 return new_list # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('new list + for. new_list:', unique(data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 5. 在原有列表上移除重復(fù)項(xiàng)目。自后往前遍歷,逐個(gè)與前面項(xiàng)比較,如果值相同且下標(biāo)相同,則移除當(dāng)前項(xiàng)。 def unique(data): l = len(data) while (l > 0): l -= 1 i = l while i > 0: i -= 1 if data[i] == data[l]: del data[l] break return data # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('one list while. last -> first result. data:', unique(data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 6. 在原有列表上移除重復(fù)項(xiàng)目。自前往后遍歷,逐個(gè)與后面項(xiàng)比較,如果值相同且下標(biāo)相同,則移除當(dāng)前項(xiàng)。 def unique(data): l = len(data) i = 0 while i < l: j = i + 1 while j < l: if data[i] == data[j]: del data[j] l -= 1 i -= 1 break j += 1 i += 1 return data # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('one list while. first -> last result. data:', unique(data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 7. 新建列表。遍歷列表,利用index比較出現(xiàn)的位置,如果出現(xiàn)在第一次的位置則追加到新數(shù)組。 def unique(data): new_list = [] for i in range(len(data)): if i == data.index(data[i]): new_list.append(data[i]) return new_list # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('for range + index. data:', unique(data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 8. 利用字典屬性唯一性來(lái)實(shí)現(xiàn)去重復(fù)。 def unique(data): obj = {} for item in data: obj[item] = item return obj.values() # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('list + dict:', unique(data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 或者直接通過(guò)dict.fromkeys來(lái)實(shí)現(xiàn) print('dict fromkeys:', dict.fromkeys(data).keys()) ## 9. 利用filter函數(shù),即把不符合條件的過(guò)濾掉。這里filter不支持下標(biāo),因此需要借助外部列表存儲(chǔ)不重復(fù)項(xiàng) def uniq(item): i = data.index(item) if (item not in new_list): new_list.append(item) return True return False def unique(item): if obj.get(item) == None: obj[item] = item return True return False # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() new_list = [] print(’filter + list + not in: ’, filter(uniq, data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 10. 利用字典結(jié)合過(guò)濾來(lái)實(shí)現(xiàn)去重復(fù)。 def unique(item): if obj.get(item) == None: obj[item] = item return True return False # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() obj = {} print('filter + dict + get:', filter(unique, data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 11. 利用map來(lái)實(shí)現(xiàn)去重復(fù)。與map與filter類(lèi)似,是一個(gè)高階函數(shù)。可以針對(duì)其中項(xiàng)逐個(gè)修改操作。 ## 與filter不同map會(huì)保留原有項(xiàng)目,并不會(huì)刪除,因此值可以改為None,然后再過(guò)濾掉。 def unique(item): if item not in new_list: new_list.append(item) return item return None # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] new_list = [] start_time = time.time() print('list from Map:', filter(lambda item: item != None, map(unique, data))) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 12. 利用set數(shù)據(jù)結(jié)構(gòu)里key的唯一性來(lái)去重復(fù) data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] print('from Set:', list(set(data))) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 13. 提前排序,從后向前遍歷,將當(dāng)前項(xiàng)與前一項(xiàng)對(duì)比,如果重復(fù)則移除當(dāng)前項(xiàng) def unique(data): data.sort() l = len(data) while (l > 0): l -= 1 if (data[l] == data[l - 1]): data.remove(data[l]) return data # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('sort + remove:', unique(data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 14. 提前排序,自前往后遍歷,將當(dāng)前項(xiàng)與后一項(xiàng)對(duì)比,如果重復(fù)則移除當(dāng)前項(xiàng) def unique(data): ''' in python 3: TypeError: ’<’ not supported between instances of ’int’ and ’str’ need to keep the same Type of member in List ''' data.sort() l = len(data) - 1 i = 0 while i < l: if (data[i] == data[i + 1]): del data[i] i -= 1 l -= 1 i += 1 return data # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('sort+del ASE:', unique(data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 15. 利用reduce函數(shù)來(lái)去重復(fù)。reduce具有累計(jì)的作用,判斷如果不在累計(jì)結(jié)果中出現(xiàn),則追加到結(jié)果中。 import functools def unique(data): new_list = [] def foo(result, item): if isinstance(result, list) == False: result = [result] return result if item in result else result + [item] return functools.reduce(foo, data) # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('functools.reduce:', unique(data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 16. 利用遞歸調(diào)用來(lái)去重復(fù)。遞歸自后往前逐個(gè)調(diào)用,當(dāng)長(zhǎng)度為1時(shí)終止。 ## 當(dāng)后一項(xiàng)與前任一項(xiàng)相同說(shuō)明有重復(fù),則刪除當(dāng)前項(xiàng)。相當(dāng)于利用自我調(diào)用來(lái)替換循環(huán) def recursion_unique(data, len): if (len <= 1): return data l = len last = l - 1 is_repeat = False while (l > 1): l -= 1 if (data[last] == data[l - 1]): is_repeat = True break if (is_repeat): del data[last] return recursion_unique(data, len - 1) # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('recursion_unique:', recursion_unique(data, len(data))) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 17. 利用遞歸調(diào)用來(lái)去重復(fù)的另外一種方式。遞歸自后往前逐個(gè)調(diào)用,當(dāng)長(zhǎng)度為1時(shí)終止。 ## 與上一個(gè)遞歸不同,這里將不重復(fù)的項(xiàng)目作為結(jié)果拼接起來(lái) def recursion_unique_new(data, len): if (len <= 1): return data l = len last = l - 1 is_repeat = False while (l > 1): l -= 1 if (data[last] == data[l - 1]): is_repeat = True break if (is_repeat): del data[last:] result = [] else: result = [data[last]] return recursion_unique_new(data, len - 1) + result # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('recursion_unique_new:', recursion_unique_new(data, len(data))) print('time:' + str((time.time() - start_time) * 1000) + ' ms') ## 18. 利用numpy lib庫(kù). 需提前安裝 `pip install numpy` import numpy as np def unique(data): res = np.array(data) return list(np.unique(res)) # test data = [’a’, ’a’, 1, 1, 2, 2, ’b’, ’b’, 2, 1] start_time = time.time() print('import numpy as np.unique:', unique(data)) print('time:' + str((time.time() - start_time) * 1000) + ' ms') Python列表去重復(fù)項(xiàng)的N種方法(實(shí)例代碼)

討論

從以上例子上可以看出,相對(duì)來(lái)講,Python比起其它語(yǔ)言要靈活得多,與JS并列最流行的腳本類(lèi)語(yǔ)言,這也就是為何Python如此流行的原因吧。

哪一種方式更適合呢?你常用那種方式來(lái)實(shí)現(xiàn)去重復(fù)項(xiàng)?新建數(shù)組、非新建、借助Dict或Set等結(jié)構(gòu),亦或是其它方式?

Python列表去重復(fù)項(xiàng)的N種方法(實(shí)例代碼)

總結(jié)

到此這篇關(guān)于Python列表去重復(fù)項(xiàng)的N種方法的文章就介紹到這了,更多相關(guān)python列表去重復(fù)項(xiàng)內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 艺术漆十大品牌_艺术涂料加盟代理_蒙太奇艺术涂料厂家品牌|艺术漆|微水泥|硅藻泥|乳胶漆 | 粉末冶金-粉末冶金齿轮-粉末冶金零件厂家-东莞市正朗精密金属零件有限公司 | 至顶网| 建筑资质代办_工程施工资质办理_资质代办公司_北京众聚企服 | J.S.Bach 圣巴赫_高端背景音乐系统_官网 | 全自动真空上料机_粉末真空上料机_气动真空上料机-南京奥威环保科技设备有限公司 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | 环比机械 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 雷达液位计_超声波风速风向仪_雨量传感器_辐射传感器-山东风途物联网 | 广东西屋电气有限公司-广东西屋电气有限公司 | 煤机配件厂家_刮板机配件_链轮轴组_河南双志机械设备有限公司 | IHDW_TOSOKU_NEMICON_EHDW系列电子手轮,HC1系列电子手轮-上海莆林电子设备有限公司 | 禹城彩钢厂_钢结构板房_彩钢复合板-禹城泰瑞彩钢复合板加工厂 | 上海公司注册-代理记账-招投标审计-上海昆仑扇财税咨询有限公司 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 硬度计,金相磨抛机_厂家-莱州华煜众信试验仪器有限公司 | 铝合金线槽_铝型材加工_空调挡水板厂家-江阴炜福金属制品有限公司 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | 低温等离子清洗机(双气路进口)-嘉润万丰 | 一体化污水处理设备_生活污水处理设备_全自动加药装置厂家-明基环保 | 硅PU球场、篮球场地面施工「水性、环保、弹性」硅PU材料生产厂家-广东中星体育公司 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 环氧铁红防锈漆_环氧漆_无溶剂环氧涂料_环氧防腐漆-华川涂料 | 曙光腾达官网-天津脚手架租赁-木板架出租-移动门式脚手架租赁「免费搭设」 | 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | 电缆故障测试仪_电缆故障定位仪_探测仪_检测仪器_陕西意联电气厂家 | 美国查特CHART MVE液氮罐_查特杜瓦瓶_制造全球品质液氮罐 | 冷热冲击试验箱_温度冲击试验箱价格_冷热冲击箱排名_林频厂家 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 数码管_LED贴片灯_LED数码管厂家-无锡市冠卓电子科技有限公司 | 菲希尔FISCHER测厚仪-铁素体检测仪-上海吉馨实业发展有限公司 | 重庆轻质隔墙板-重庆安吉升科技有限公司 | Brotu | 关注AI,Web3.0,VR/AR,GPT,元宇宙区块链数字产业 | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 牛奶检测仪-乳成分分析仪-北京海谊| 天津力值检测-天津管道检测-天津天诚工程检测技术有限公司 |