成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python列表去重復項的N種方法

開發 后端
在實際編程中,經常會遇到數組或列表去掉重復項,保持成員唯一性。實現方式有多種,比如新建列表來存儲非重復項,或者在原有基礎上刪除掉重復的項,也可以利用數據結構來達到去重復。具體哪一種方法更好呢?以下約20種方式都可以實現,我們可以通過這些來交流和學習。

說明

Python語言中列表(List)與其他語言的數組(Array)類似,是一種有序的集合數據結構,Python List可支持各種數據類型,長度也可動態調整,與JS中的數組或Java ArrayList很接近。在實際編程中,經常會遇到數組或列表去掉重復項,保持成員唯一性。實現方式有多種,比如新建列表來存儲非重復項,或者在原有基礎上刪除掉重復的項,也可以利用數據結構來達到去重復。具體哪一種方法更好呢?以下約20種方式都可以實現,我們可以通過這些來交流和學習。

 

Python列表去重復項的N種方法

方式

 

  1. ## 1. 新建列表,如果新列表中不存在,則添加到新列表。 
  2. def unique(data): 
  3.     new_list = [] 
  4.     for item in data: 
  5.         if item not in new_list: 
  6.             new_list.append(item) 
  7.     return new_list 
  8.  
  9.  
  10. # test 
  11. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  12. start_time = time.time() 
  13. print("new_list + not in data:"unique(data)) 
  14. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  15.  
  16. # result 
  17. $ python -V 
  18. Python 2.7.16 
  19. $ python unique.py  
  20. ('for list + not in. data:', ['a', 1, 2, 'b']) 
  21. time:0.0441074371338 ms 
  22.  
  23. ## 2. 新建列表。根據下標判斷是否存在新列表中,如果新列表中不存在則添加到新列表。 
  24. def unique(data): 
  25.     new_list = [] 
  26.     for i in range(len(data)): 
  27.         if data[i] not in new_list: 
  28.             new_list.append(data[i]) 
  29.     return new_list 
  30.  
  31.  
  32. ## 2.1 新建列表,使用列表推導來去重。是前一種的簡寫。 
  33. def unique(data): 
  34.     new_list = [] 
  35.     [new_list.append(i) for i in data if not i in new_list] 
  36.     return new_list 
  37.  
  38. # test 
  39. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  40. start_time = time.time() 
  41. print("for range + not in. data:"unique(data)) 
  42. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  43.  
  44. ## 3. 通過index找不到該項,則追加到新列表中。index找不到會報錯,因此放在異常處理里。 
  45. def unique(data): 
  46.     new_list = [] 
  47.     for i in range(len(data)): 
  48.         item = data[i] 
  49.         try: 
  50.             if (new_list.index(item) < 0): 
  51.                 print('new_list:', new_list) 
  52.         except ValueError: 
  53.             new_list.append(item) 
  54.     return new_list 
  55.  
  56.  
  57. # test 
  58. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  59. start_time = time.time() 
  60. print("list index + except:"unique(data)) 
  61. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  62.  
  63. ## 4. 新建列表,兩個循環。如果內循環與外循環項相同,且下標相同就添加到新列表,其余忽略 
  64. def unique(data): 
  65.     new_list = [] 
  66.     for i in range(len(data)): 
  67.         j = 0 
  68.         while j <= i: 
  69.             if data[i] == data[j]: 
  70.                 if i == j: 
  71.                     new_list.append(data[i]) 
  72.                 break 
  73.             j += 1 
  74.     return new_list 
  75.  
  76. # test 
  77. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  78. start_time = time.time() 
  79. print("new list + for. new_list:"unique(data)) 
  80. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  81.  
  82. ## 5. 在原有列表上移除重復項目。自后往前遍歷,逐個與前面項比較,如果值相同且下標相同,則移除當前項。 
  83. def unique(data): 
  84.     l = len(data) 
  85.     while (l > 0): 
  86.         l -= 1 
  87.         i = l 
  88.         while i > 0: 
  89.             i -= 1 
  90.             if data[i] == data[l]: 
  91.                 del data[l] 
  92.                 break 
  93.     return data 
  94.  
  95. # test 
  96. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  97. start_time = time.time() 
  98. print("one list while. last -> first result. data:"unique(data)) 
  99. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  100.  
  101. ## 6. 在原有列表上移除重復項目。自前往后遍歷,逐個與后面項比較,如果值相同且下標相同,則移除當前項。 
  102. def unique(data): 
  103.     l = len(data) 
  104.     i = 0 
  105.     while i < l: 
  106.         j = i + 1 
  107.         while j < l: 
  108.             if data[i] == data[j]: 
  109.                 del data[j] 
  110.                 l -= 1 
  111.                 i -= 1 
  112.                 break 
  113.             j += 1 
  114.         i += 1 
  115.     return data 
  116.  
  117.  
  118. # test 
  119. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  120. start_time = time.time() 
  121. print("one list while. first -> last result. data:"unique(data)) 
  122. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  123.  
  124. ## 7. 新建列表。遍歷列表,利用index比較出現的位置,如果出現在第一次的位置則追加到新數組。 
  125. def unique(data): 
  126.     new_list = [] 
  127.     for i in range(len(data)): 
  128.         if i == data.index(data[i]): 
  129.             new_list.append(data[i]) 
  130.     return new_list 
  131.  
  132.  
  133. # test 
  134. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  135. start_time = time.time() 
  136. print("for range + index. data:"unique(data)) 
  137. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  138.  
  139. ## 8. 利用字典屬性唯一性來實現去重復。 
  140. def unique(data): 
  141.     obj = {} 
  142.     for item in data: 
  143.         obj[item] = item 
  144.     return obj.values() 
  145.  
  146.  
  147. # test 
  148. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  149. start_time = time.time() 
  150. print("list + dict:"unique(data)) 
  151. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  152.  
  153. ## 或者直接通過dict.fromkeys來實現 
  154. print("dict fromkeys:", dict.fromkeys(data).keys()) 
  155.  
  156. ## 9. 利用filter函數,即把不符合條件的過濾掉。這里filter不支持下標,因此需要借助外部列表存儲不重復項 
  157. def uniq(item): 
  158.     i = data.index(item) 
  159.     if (item not in new_list): 
  160.         new_list.append(item) 
  161.         return True 
  162.     return False 
  163. def unique(item): 
  164.     if obj.get(item) == None: 
  165.         obj[item] = item 
  166.         return True 
  167.     return False 
  168.  
  169.  
  170. # test 
  171. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  172. start_time = time.time() 
  173. new_list = [] 
  174. print('filter + list + not in: ', filter(uniq, data)) 
  175. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  176.  
  177. ## 10. 利用字典結合過濾來實現去重復。 
  178. def unique(item): 
  179.     if obj.get(item) == None: 
  180.         obj[item] = item 
  181.         return True 
  182.     return False 
  183.  
  184.  
  185. # test 
  186. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  187. start_time = time.time() 
  188. obj = {} 
  189. print("filter + dict + get:", filter(unique, data)) 
  190. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  191.  
  192. ## 11. 利用map來實現去重復。與map與filter類似,是一個高階函數??梢葬槍ζ渲许椫饌€修改操作。 
  193. ## 與filter不同map會保留原有項目,并不會刪除,因此值可以改為None,然后再過濾掉。 
  194. def unique(item): 
  195.     if item not in new_list: 
  196.         new_list.append(item) 
  197.         return item 
  198.     return None 
  199.  
  200.  
  201. # test 
  202. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  203. new_list = [] 
  204. start_time = time.time() 
  205.  
  206. print("list from Map:", filter(lambda item: item != None, map(unique, data))) 
  207. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  208.  
  209. ## 12. 利用set數據結構里key的唯一性來去重復 
  210. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  211. print("from Set:", list(set(data))) 
  212. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  213.  
  214. ## 13. 提前排序,從后向前遍歷,將當前項與前一項對比,如果重復則移除當前項 
  215. def unique(data): 
  216.     data.sort() 
  217.     l = len(data) 
  218.     while (l > 0): 
  219.         l -= 1 
  220.         if (data[l] == data[l - 1]): 
  221.             data.remove(data[l]) 
  222.     return data 
  223.  
  224.  
  225. # test 
  226. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  227. start_time = time.time() 
  228. print("sort + remove:"unique(data)) 
  229. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  230.  
  231. ## 14. 提前排序,自前往后遍歷,將當前項與后一項對比,如果重復則移除當前項 
  232. def unique(data): 
  233.     ""
  234.      in python 3: TypeError: '<' not supported between instances of 'int' and 'str' 
  235.      need to keep the same Type of member in List 
  236.     ""
  237.     data.sort() 
  238.     l = len(data) - 1 
  239.     i = 0 
  240.     while i < l: 
  241.         if (data[i] == data[i + 1]): 
  242.             del data[i] 
  243.             i -= 1 
  244.             l -= 1 
  245.         i += 1 
  246.     return data 
  247.  
  248.  
  249. # test 
  250. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  251. start_time = time.time() 
  252. print("sort+del ASE:"unique(data)) 
  253. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  254.  
  255. ## 15. 利用reduce函數來去重復。reduce具有累計的作用,判斷如果不在累計結果中出現,則追加到結果中。 
  256. import functools 
  257.  
  258.  
  259. def unique(data): 
  260.     new_list = [] 
  261.  
  262.     def foo(result, item): 
  263.         if isinstance(result, list) == False
  264.             result = [result] 
  265.         return result if item in result else result + [item] 
  266.  
  267.     return functools.reduce(foo, data) 
  268.  
  269.  
  270. # test 
  271. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  272. start_time = time.time() 
  273. print("functools.reduce:"unique(data)) 
  274. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  275.  
  276. ## 16. 利用遞歸調用來去重復。遞歸自后往前逐個調用,當長度為1時終止。 
  277. ## 當后一項與前任一項相同說明有重復,則刪除當前項。相當于利用自我調用來替換循環 
  278. def recursion_unique(data, len): 
  279.     if (len <= 1): 
  280.         return data 
  281.  
  282.     l = len 
  283.     last = l - 1 
  284.     is_repeat = False 
  285.  
  286.     while (l > 1): 
  287.         l -= 1 
  288.         if (data[last] == data[l - 1]): 
  289.             is_repeat = True 
  290.             break 
  291.  
  292.     if (is_repeat): 
  293.         del data[last
  294.  
  295.     return recursion_unique(data, len - 1) 
  296.  
  297.  
  298. # test 
  299. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  300. start_time = time.time() 
  301. print("recursion_unique:", recursion_unique(data, len(data))) 
  302. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  303.  
  304. ## 17. 利用遞歸調用來去重復的另外一種方式。遞歸自后往前逐個調用,當長度為1時終止。 
  305. ## 與上一個遞歸不同,這里將不重復的項目作為結果拼接起來 
  306. def recursion_unique_new(data, len): 
  307.     if (len <= 1): 
  308.         return data 
  309.  
  310.     l = len 
  311.     last = l - 1 
  312.     is_repeat = False 
  313.     while (l > 1): 
  314.         l -= 1 
  315.         if (data[last] == data[l - 1]): 
  316.             is_repeat = True 
  317.             break 
  318.  
  319.     if (is_repeat): 
  320.         del data[last:] 
  321.         result = [] 
  322.     else
  323.         result = [data[last]] 
  324.  
  325.     return recursion_unique_new(data, len - 1) + result 
  326.  
  327.  
  328. # test 
  329. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  330. start_time = time.time() 
  331. print("recursion_unique_new:", recursion_unique_new(data, len(data))) 
  332. print("time:" + str((time.time() - start_time) * 1000) + " ms"
  333.  
  334. ## 18. 利用numpy lib庫. 需提前安裝 `pip install numpy` 
  335. import numpy as np 
  336.  
  337.  
  338. def unique(data): 
  339.     res = np.array(data) 
  340.     return list(np.unique(res)) 
  341.  
  342.  
  343. # test 
  344. data = ['a''a', 1, 1, 2, 2, 'b''b', 2, 1] 
  345. start_time = time.time() 
  346. print("import numpy as np.unique:"unique(data)) 
  347. print("time:" + str((time.time() - start_time) * 1000) + " ms"

 

Python列表去重復項的N種方法

討論

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

哪一種方式更適合呢?你常用那種方式來實現去重復項?新建數組、非新建、借助Dict或Set等結構,亦或是其它方式?

 

Python列表去重復項的N種方法

 

 

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2022-04-14 15:12:40

Java8Stream列表

2020-06-15 08:07:30

命令Linux字符

2021-02-06 11:26:55

Python開發list

2021-02-03 18:05:30

Python方法列表

2025-01-03 08:48:20

列表推導式Python編程

2021-12-06 06:58:50

List重復數據

2022-01-20 09:58:44

Python元素列表

2010-11-15 14:42:03

Oracle查詢重復記

2010-07-01 12:29:27

SQL Server重

2023-09-21 11:03:31

開發輪子工具

2020-02-21 13:55:35

CSS分隔線前端

2010-04-30 10:40:19

Oracle實現

2010-09-02 10:36:51

SQL刪除

2024-10-16 18:09:54

2024-01-12 08:40:56

Python計算質數質數

2015-08-04 09:18:26

JavaArrayList元素

2010-11-09 14:35:48

SQL Server查

2010-07-23 10:54:09

優化SQL Serve

2019-10-08 10:28:36

Python程序員鏡音雙子

2021-03-08 09:32:04

Python文件命令
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九色 在线| 成人二区| 欧美视频一区二区三区 | 奇米超碰在线 | 成人午夜在线观看 | 国产一区二区三区亚洲 | 日本高清不卡视频 | 日韩在线第一 | 国产三区视频在线观看 | 91亚洲一区 | 日本在线免费视频 | 欧美黑人体内she精在线观看 | 精品影院 | 日韩性在线 | 浮生影院免费观看中文版 | 天天综合国产 | 久久高清免费视频 | 超碰av在线 | 精品国产欧美一区二区 | 亚洲人成在线播放 | 久久亚洲国产精品 | 91精品国产一区二区三区 | 香蕉久久a毛片 | 日本三级网址 | 国产精品色| 欧美亚洲国产一区 | 在线播放国产一区二区三区 | 九九热在线免费视频 | 一级片免费视频 | 亚洲精品日韩综合观看成人91 | 欧美一区二区三区 | 真人毛片 | 国产精品视频一区二区三区不卡 | 97国产成人 | 日韩中文字幕在线免费 | 久久国产精品免费一区二区三区 | 免费 视频 1级| 日韩和的一区二在线 | 一区二区三区高清 | 欧美日韩电影免费观看 | 亚洲一区二区三区免费视频 |