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

哪种方法可以更快地展平列表?

时间:2023-03-18 20:17:18 科技观察

在平时的编码过程中,我们经常会遇到需要将嵌套列表压扁的需求,例如将列表[[1,2,3],[4,5]]改成[1,2,3,4],5]、Python有很多种实现这个功能的方法,哪种方法比较快?让我们今天试试看。第一种方法:构建一个空列表,遍历嵌套列表并将元素一个一个放回:defflatten1(lst:List[list])->list:flat=[]forlinlst:forxinl:flat.append(x)returnflat第二种方法:使用列表推导:deflatten2(lst:List[list])->list:return[xforlinlstforxinl]第三种方法:使用列表的extend方法:defflatten3(lst:List[list])->list:flat=[]forlinlst:flat.extend(l)returnflat第四种方法:使用+号:defflatten4(lst:List[list])->list:flat=[]forlinlst:flat+=lreturnflat第五种方法:使用itertools.chain:deflatten5(lst:List[list])->list:returnlist(itertools.chain.from_iterable(lst))第六种方法:使用functools.reduce:defflatten6(lst:List[list])->list:returnfunctools.reduce(operator.iconcat,lst,[])可以先猜一下,再看下面的运行结果:(X)返回flatdeflatten2(lst:List[list])->list:return[xforlinlstforxinl]deflatten3(lst:List[list])->list:flat=[]forlinlst:flat.extend(l)returnflatdeflatten4(lst:List[list])->李st:flat=[]forlinlst:flat+=lreturnflatdeflatten5(lst:List[list])->list:returnlist(itertools.chain.from_iterable(lst))defflatten6(lst:List[list])->list:returnfunctools。减少(operator.iconcat,lst,[])#+=deftime_f(f):elapsed=0.0n=100M=1000N=100for_inrange(n):lst=[[random.randint(0,1000000)forjinrange(N)]foriinrange(M)]start=time.perf_counter()f(lst)elapsed+=time.perf_counter()-startprint(f"{f.__name__}cost{elapsed/n*1000:.4f}ms")if__name__=='__main__':time_f(flatten1)time_f(flatten2)time_f(flatten3)time_f(flatten4)time_f(flatten5)time_f(flatten6)运行环境:Python3.8.5,运行结果如下:结果:前两种方法是比较慢,不推荐使用,后四种方式差别不大,可以选择