如何整理列表项?假设,如果我有一个列表l = [' a'' b',' c'' d',' E'' F''&#39克;,' H''我'] 要求是将a,b,c转换为一个列表,d,e,f转换为其他列表,将g,h,i转换为另一个列表。当前实现是
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
以及下一个项目。这有什么更好的逻辑吗?目前的实施中,Cyclomatic Complexity很高。
答案 0 :(得分:2)
在您的示例中,您不得在列表中使用find
,因为:
if "a" in l
find
中的in
甚至list
具有线性(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)