Python 2.7 组织列表中的项目

Python 2.7 组织列表中的项目,python-2.7,python-3.x,Python 2.7,Python 3.x,如何组织项目列表?假设,如果我有一个列表l=['a','b','c','d','e','f','g','h','i'] 要求将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):

如何组织项目列表?假设,如果我有一个列表l=['a','b','c','d','e','f','g','h','i'] 要求将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

至于接下来的项目,有没有更好的逻辑?对于当前的实现,圈复杂度很高。

在您的示例中,您不能在列表中使用
find
,因为:

  • 您实际上不需要索引,因此只要在l中使用a就可以了
  • find
    或甚至
    中的
    列表中的
    具有线性(O(n))复杂性,因此这不是最优的。在一个小列表中不明显,但有一百万个元素,它是
with具有线性复杂度,并循环搜索项而不是列表本身

集合
中,元素被散列(并且必须是唯一的),以确保更好的搜索性能(以及插入性能,但这不是重点)

结果:

['a', 'b', 'c']
list elapsed 17.284000
set elapsed 0.000000
有趣的是,上面的代码与
集合
一起工作,但与
列表
一起工作,因为
中的
由所有集合对象共享。只有性能不同。
你可以用
l=['a'、'b'、'c'、'd'、'e'、'f']来替换第一行。
它可以工作,但是你会得到很差的性能(当然,不是6项),就像你在问题中的例子一样

对于仍然怀疑
set
对象的功能的人们来说,这里有一个测试来检查该项是否在列表中。我已为
列表选择了最坏情况,但可以使用另一个值

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))
结果:

['a', 'b', 'c']
list elapsed 17.284000
set elapsed 0.000000

甚至不关闭:)并且您可以减少搜索值,
列表
值将减少(但是
集合
将始终显示0)

请发布一个。您提供的
列表l=[a、b、c、d、e、f、g、h、i]
缺少引号,并且您没有准确解释您想要的内容。输入列表是否已排序?输出列表是否也要排序?含糊不清。很抱歉遗漏了报价!。输出列表可能未排序,我只想将列表l中的输入分组到不同的列表。然后您可以编辑您的问题。
如果我在[“a”、“b”、“c”]:…
?你能更好地描述一下选择背后的逻辑吗?set在这里做什么?为什么不能只列出l?输入有大量元素。我只是选择了6作为示例。如果l中的“a”表示每个元素,我就做不到!我知道如果我们使用find/or,复杂性很高。我只是想有一个解决办法来避免这些!如果您有一个列表作为输入,那么您必须创建一个具有相同元素的集合,以便能够使用二分法搜索。