组织列表项

时间:2016-08-26 05:41:51

标签: python-2.7 python-3.x

如何整理列表项?假设,如果我有一个列表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很高。

1 个答案:

答案 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)