当前位置: 首页 > 科技观察

Python列表去重的N种方法

时间:2023-03-19 17:32:32 科技观察

说明Python语言中的List类似于其他语言中的Array,是一种有序的集合数据结构,PythonList可以支持各种数据类型,长度也可以动态调整,这非常接近JS或者Java中的ArrayList中的数组。在实际编程中,经常会遇到数组或列表去重,保持成员唯一性的情况。实现方式有很多种,比如创建一个新的列表来存储不重复的项,或者在原来的基础上删除重复的项,或者使用数据结构来实现去重。哪种方法更好?可以实现以下20种方式,我们可以通过这些方式进行交流和学习。方法##1。创建一个新列表,如果新列表中不存在,则将其添加到新列表中。defunique(data):new_list=[]foritemindata:ifitemnotinnew_list:new_list.append(item)返回new_list#testdata=['a','a',1,1,2,2,'b','b',2,1]start_time=time.time()print("new_list+notindata:",unique(data))print("time:"+str((time.time()-start_time)*1000)+"ms")#结果$python-VPython2.7.16$pythonunique.py('forlist+notin.data:',['a',1,2,'b'])time:0.0441074371338ms##2.创建一个新列表。根据下标判断是否存在于新列表中,如果不存在于新列表中则添加到新列表中。defunique(data):new_list=[]foriinrange(len(data)):ifdata[i]notinnew_list:new_list.append(data[i])returnnew_list##2.1新建一个列表,使用列表推导去重。是前者的缩写。defunique(数据):new_list=[][new_list.append(i)foriindataifnotiinnew_list]returnnew_list#testdata=['a','a',1,1,2,2,'b','b',2,1]start_time=time.time()print("forrange+notin.data:",unique(data))print("time:"+str((time.time()-start_time)*1000)+"ms")##3。如果无法通过索引找到该项目,它将附加到新列表中。如果找不到索引会报错,所以放在异常处理中。defunique(data):new_list=[]foriinrange(len(data)):item=data[i]try:if(new_list.index(item)<0):print('new_list:',new_list)exceptValueError:new_list。append(item)returnnew_list#testdata=['a','a',1,1,2,2,'b','b',2,1]start_time=time.time()print("列表索引+除了:",unique(data))print("time:"+str((time.time()-start_time)*1000)+"ms")##4。新列表,两个循环。如果内循环与外循环项相同,且下标相同,则将其添加到新列表中,其余忽略defunique(data):new_list=[]foriinrange(len(data)):j=0whilej<=i:ifdata[i]==data[j]:ifi==j:new_list.append(data[i])breakj+=1returnnew_list#testdata=['a','a',1,1,2,2,'b','b',2,1]start_time=time.time()print("newlist+for.new_list:",unique(data))print("time:"+str((time.time()-start_time)*1000)+"ms")##5。删除原始列表中的重复项目。从后向前遍历,与前面的项一项一项进行比较,如果值相同且下标相同,则移除当前项。defunique(数据):l=len(数据)while(l>0):l-=1i=lwhiei>0:i-=1ifdata[i]==data[l]:deldata[l]breakreturndata#testdata=['a','a',1,1,2,2,'b','b',2,1]start_time=time.time()print("onelistwhile.last->firstresult.data:",unique(数据))打印(“时间:”+str((time.time()-start_time)*1000)+“ms”)##6。从原始列表中删除重复项。从前向后遍历,与后面的项一项一项进行比较,如果值相同且下标相同,则移除当前项。defunique(数据):l=len(数据)i=0whileilastresult.数据:”,唯一(数据))打印(“时间:”+str((time.time()-start_time)*1000)+“ms”)##7。创建一个新列表。遍历列表,使用索引比较出现的位置,如果出现在第一个位置,追加到一个新的数组中。defunique(数据):new_list=[]foriinrange(len(data)):ifi==data.index(data[i]):new_list.append(data[i])returnnew_list#testdata=['a','a',1,1,2,2,'b','b',2,1]start_time=time.time()print("forrange+index.data:",unique(data))print("时间:"+str((time.time()-start_time)*1000)+"ms")##8。利用字典属性的唯一性来实现去重。defunique(data):obj={}foritemindata:obj[item]=itemreturnobj.values()#testdata=['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")##或者直接通过dict.fromkeys来实现print("dictfromkeys:",dict.fromkeys(data).keys())##9.使用过滤功能过滤掉不符合条件的。这里的filter不支持下标,所以需要使用外部列表来存储不重复项)==None:obj[item]=itemreturnTruereturnFalse#testdata=['a','a',1,1,2,2,'b','b',2,1]start_time=time.time()new_list=[]print('filter+list+notin:',filter(uniq,data))print("time:"+str((time.time()-start_time)*1000)+"ms")##10.使用字典结合过滤实现去重。defunique(item):ifobj.get(item)==None:obj[item]=itemreturnTruereturnFalse#testdata=['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)+“毫秒”)##11。使用map实现去重。与map、filter类似,是高阶函数。可以逐项修改操作。##与filter不同,map会保留原来的item,不会删除,所以可以把value改成None,然后过滤掉。defunique(项目):ifitemnotinnew_list:new_list.append(项目)returnitemreturnNone#testdata=['a','a',1,1,2,2,'b','b',2,1]new_list=[]start_time=time.time()print("listfromMap:",filter(lambdaitem:item!=None,map(unique,data)))print("time:"+str((time.time()-start_time)*1000)+“毫秒”)##12。利用set数据结构中key的唯一性重复data=['a','a',1,1,2,2,'b','b',2,1]print("fromSet:",list(set(data)))print("time:"+str((time.time()-start_time)*1000)+"ms")##13。AdvanceSort,从后向前遍历,将当前项与前一项进行比较,如果重复则移除当前项defunique(data):data.sort()l=len(data)while(l>0):l-=1if(数据[l]==数据[l-1]):data.remove(数据[l])returndata#testdata=['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)+"毫秒")##14。提前排序,从前向后遍历,比较当前项和下一项,重复则移除当前项defunique(data):"""inpython3:TypeError:'<'notsupportedbetweeninstancesof'int'and'str'需要keepthesameTypeofmemberinList"""data.sort()l=len(data)-1i=0while1):l-=1if(data[last]==数据[l-1]):is_repeat=Truebreakif(is_repeat):deldata[last]returnrecursion_unique(data,len-1)#testdata=['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()-开始时间)*1000)+“毫秒”)##17。另一种方法是使用递归调用来重复。递归从后向前一一调用,当长度为1时结束。##与之前的递归不同,这里将不重复的项拼接在一起作为结果defrecursion_unique_new(data,len):if(len<=1):returndatal=lenlast=l-1is_repeat=Falsewhile(l>1):l-=1if(数据[last]==data[l-1]):is_repeat=Truebreakif(is_repeat):deldata[last:]result=[]else:result=[data[last]]returnrecursion_unique_new(data,len-1)+result#testdata=['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。使用numpylib库。需要提前安装`pipinstallnumpy`importnumpyasnpdefunique(data):res=np.array(data)returnlist(np.unique(res))#testdata=['a','a',1,1,2,2,'b','b',2,1]start_time=time.time()print("importnumpyasnp.unique:",unique(data))print("time:"+str((time.time()-start_time)*1000)+"ms")讨论从上面的例子可以看出,相对而言,Python比其他语言灵活得多,是与JS并列的最流行的脚本语言,这也是Python如此受欢迎的原因。哪种方法更合适?您通常使用哪种方法来实现去重?新数组,非new,有Dict或Set等结构,还是其他方法?