簡體   English   中英

Python - 在這種情況下列表理解是有效的嗎?

[英]Python - list comprehension in this case is efficient?

這是python中輸入的“臟”列表

input_list = ['  \n  ','  data1\n ','   data2\n','  \n','data3\n'.....]

每個列表元素包含帶有新行字符的空格或帶有換行字符的數據

使用以下代碼清理它..

cleaned_up_list = [data.strip() for data in input_list if data.strip()]

  cleaned_up_list =   ['data1','data2','data3','data4'..]

在上面的列表理解期間,python是否在內部調用了strip()兩次? 或者如果我關心效率,我是否必須使用for循環迭代和strip()一次?

for data in input_list
  clean_data = data.strip()
     if(clean_data):
         cleaned_up_list.append(clean_data)

使用你的列表comp strip 調用兩次,如果你只想調用一次strip並保持理解,則使用gen exp:

input_list[:] = [x for x in (s.strip() for s in input_list) if x]

輸入:

input_list = ['  \n  ','  data1\n ','   data2\n','  \n','data3\n']

輸出:

 ['data1', 'data2', 'data3']

input_list[:]將更改原始列表,這可能是你想要的,也可能不是你想要的,如果你真的想創建一個新列表,只需使用cleaned_up_list = ...

我總是發現在python 2中使用itertools.imap並在python 3中map而不是生成器對於較大的輸入是最有效的:

from itertools import imap
input_list[:] = [x for x in imap(str.strip, input_list) if x]

一些時間采用不同的方法:

In [17]: input_list = [choice(input_list) for _ in range(1000000)]   

In [19]: timeit filter(None, imap(str.strip, input_list))
10 loops, best of 3: 115 ms per loop

In [20]: timeit list(ifilter(None,imap(str.strip,input_list)))
10 loops, best of 3: 110 ms per loop

In [21]: timeit [x for x in imap(str.strip,input_list) if x]
10 loops, best of 3: 125 ms per loop

In [22]: timeit [x for x in (s.strip() for s in input_list) if x]  
10 loops, best of 3: 145 ms per loop

In [23]: timeit [data.strip() for data in input_list if data.strip()]
10 loops, best of 3: 160 ms per loop

In [24]: %%timeit                                                
   ....:     cleaned_up_list = []
   ....:     for data in input_list:
   ....:          clean_data = data.strip()
   ....:          if clean_data:
   ....:              cleaned_up_list.append(clean_data)
   ....: 

10 loops, best of 3: 150 ms per loop

In [25]: 

In [25]: %%timeit                                                    
   ....:     cleaned_up_list = []
   ....:     append = cleaned_up_list.append
   ....:     for data in input_list:
   ....:          clean_data = data.strip()
   ....:          if clean_data:
   ....:              append(clean_data)
   ....: 

10 loops, best of 3: 123 ms per loop

最快的方法實際上是itertools.ifilter聯合itertools.imap緊隨其后的是filterimap

無需重新評估函數引用list.append每次迭代都更有效,如果您遇到循環並想要最有效的方法那么它是一個可行的替代方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM