在你的榜樣,您不能在列表中,因爲使用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)
請發表[ MCVE。你提供了缺少引號的'list l = [a,b,c,d,e,f,g,h,i]',而且你沒有準確解釋你想要的內容。輸入列表是否已排序?輸出列表是否也要排序?模糊。 –
抱歉缺少引號!。輸出列表可能未被排序,我只是想將列表l中的輸入分組到不同的列表中。 – PythonDev
然後你可以編輯你的問題。 –