自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python列表去重復(fù)項的N種方法

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

說明

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

 

Python列表去重復(fù)項的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. 新建列表。根據(jù)下標判斷是否存在新列表中,如果新列表中不存在則添加到新列表。 
  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 新建列表,使用列表推導(dǎo)來去重。是前一種的簡寫。 
  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. 新建列表,兩個循環(huán)。如果內(nèi)循環(huán)與外循環(huán)項相同,且下標相同就添加到新列表,其余忽略 
  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. 在原有列表上移除重復(fù)項目。自后往前遍歷,逐個與前面項比較,如果值相同且下標相同,則移除當(dāng)前項。 
  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. 在原有列表上移除重復(fù)項目。自前往后遍歷,逐個與后面項比較,如果值相同且下標相同,則移除當(dāng)前項。 
  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比較出現(xiàn)的位置,如果出現(xiàn)在第一次的位置則追加到新數(shù)組。 
  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. 利用字典屬性唯一性來實現(xiàn)去重復(fù)。 
  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來實現(xiàn) 
  154. print("dict fromkeys:", dict.fromkeys(data).keys()) 
  155.  
  156. ## 9. 利用filter函數(shù),即把不符合條件的過濾掉。這里filter不支持下標,因此需要借助外部列表存儲不重復(fù)項 
  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. 利用字典結(jié)合過濾來實現(xiàn)去重復(fù)。 
  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來實現(xiàn)去重復(fù)。與map與filter類似,是一個高階函數(shù)??梢葬槍ζ渲许椫饌€修改操作。 
  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數(shù)據(jù)結(jié)構(gòu)里key的唯一性來去重復(fù) 
  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. 提前排序,從后向前遍歷,將當(dāng)前項與前一項對比,如果重復(fù)則移除當(dāng)前項 
  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. 提前排序,自前往后遍歷,將當(dāng)前項與后一項對比,如果重復(fù)則移除當(dāng)前項 
  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函數(shù)來去重復(fù)。reduce具有累計的作用,判斷如果不在累計結(jié)果中出現(xiàn),則追加到結(jié)果中。 
  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. 利用遞歸調(diào)用來去重復(fù)。遞歸自后往前逐個調(diào)用,當(dāng)長度為1時終止。 
  277. ## 當(dāng)后一項與前任一項相同說明有重復(fù),則刪除當(dāng)前項。相當(dāng)于利用自我調(diào)用來替換循環(huán) 
  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. 利用遞歸調(diào)用來去重復(fù)的另外一種方式。遞歸自后往前逐個調(diào)用,當(dāng)長度為1時終止。 
  305. ## 與上一個遞歸不同,這里將不重復(fù)的項目作為結(jié)果拼接起來 
  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列表去重復(fù)項的N種方法

討論

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

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

 

Python列表去重復(fù)項的N種方法

 

 

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2022-04-14 15:12:40

Java8Stream列表

2021-02-03 18:05:30

Python方法列表

2025-01-03 08:48:20

列表推導(dǎo)式Python編程

2021-02-06 11:26:55

Python開發(fā)list

2020-06-15 08:07:30

命令Linux字符

2021-12-06 06:58:50

List重復(fù)數(shù)據(jù)

2022-01-20 09:58:44

Python元素列表

2023-09-21 11:03:31

開發(fā)輪子工具

2010-07-01 12:29:27

SQL Server重

2010-11-15 14:42:03

Oracle查詢重復(fù)記

2020-02-21 13:55:35

CSS分隔線前端

2010-04-30 10:40:19

Oracle實現(xiàn)

2024-10-16 18:09:54

2015-08-04 09:18:26

JavaArrayList元素

2010-09-02 10:36:51

SQL刪除

2024-01-12 08:40:56

Python計算質(zhì)數(shù)質(zhì)數(shù)

2010-11-09 14:35:48

SQL Server查

2020-10-15 12:30:37

Python編程語言

2010-07-23 10:54:09

優(yōu)化SQL Serve

2023-12-29 09:23:25

Python回調(diào)函數(shù)遍歷字典
點贊
收藏

51CTO技術(shù)棧公眾號