2016-08-26 108 views
-1

如何組織列表項目?假設,如果我有一個列表l = ['a','b','c','d','e','f','g','h','i'] 要求是得到一個,b,C到一個列表,d,E,F到其他和G,H,i到另一list.Current實現是組織列表項目

list l = ['a','b','c','d','e','f','g','h','i'] 
m= list() 
for i in l: 
    if (i.find("a")>=0) or (i.find("b")>=0) or (i.find("c")>=0): 
     m.append(i) 
     print m 

等爲下次items.Is有沒有更好的邏輯來這個?隨着目前的實施,Cyclomatic Complexity很高。

+1

請發表[ MCVE。你提供了缺少引號的'list l = [a,b,c,d,e,f,g,h,i]',而且你沒有準確解釋你想要的內容。輸入列表是否已排序?輸出列表是否也要排序?模糊。 –

+0

抱歉缺少引號!。輸出列表可能未被排序,我只是想將列表l中的輸入分組到不同的列表中。 – PythonDev

+0

然後你可以編輯你的問題。 –

回答

2

在你的榜樣,您不能在列表中,因爲使用find

  • 你並不真正需要的指數,讓你簡直在list使用if "a" in l
  • find甚至in有線性(O(n))複雜度,所以這不是最優的。在一個小列表上不明顯,但有一百萬個元素。

具有線性複雜度,並循環搜索項目而不是列表本身。

set中,元素被散列(並且必須是唯一的,然後)確保更好的搜索性能(並且插入性能,但這不是重點)。

l= set(['a','b','c','d','e','f']) 
m=list() 
for i in ['a','b','z','c']: # I have introduced an extra element 
    if i in l: 
     m.append(i) 

print(m) 

結果:

['a', 'b', 'c'] 

什麼是有趣的是,上面的代碼是,它與set但有list因爲in是所有集合對象共享。只有表現不同。 你可以用l= ['a','b','c','d','e','f']代替第一行,但它會起作用,但是你會得到不好的表現(當然不是6項),就像你在問題中的例子。

對於仍然懷疑set對象的威力的人們的證明,下面是檢查項目是否在列表中的測試。我選擇了list的最壞情況,但可以用另一個值來完成。

import time 

data=range(1000000) 

start_time = time.time() 
for i in range(1,1000): 
    999999 in data 

print("list elapsed %f" % (time.time()-start_time)) 

data=set(data) 

start_time = time.time() 
for i in range(1,1000): 
    999999 in data 

print("set elapsed %f" % (time.time()-start_time)) 

結果:

list elapsed 17.284000 
set elapsed 0.000000 

甚至還沒有接近:),你可以減少搜索到的值時,list值將減少(但set將始終顯示0)

+0

這裏設置了什麼?爲什麼我不能只列出名單? – PythonDev

+0

輸入有大量的元素。我只是選擇了6個例子。如果每個元素都有「a」,我就無法做到!我知道如果使用find/or,複雜度很高。我只想有一個解決方案來避免這些! – PythonDev

+0

如果您有一個列表作爲輸入,您必須創建一個具有相同元素的集合才能使用二分搜索。 –