在一个大的python列表中的文本搜索元素

时间:2015-07-22 16:05:57

标签: python regex python-3.x

列表看起来像:

cell_lines = ["LN18_CENTRAL_NERVOUS_SYSTEM","769P_KIDNEY","786O_KIDNEY"]

随着我对正则表达式的探讨,除了循环遍历每个元素并执行搜索之外,我无法找到一种令人信服的方式来搜索列表中的单个字符串。

如何以有效的方式检索包含“KIDNEY”的索引(因为我有一个长度为千的列表)?

2 个答案:

答案 0 :(得分:1)

制作list comprehension

[line for line in cell_lines if "KIDNEY" in line]

这是O(n),因为我们会检查列表中的每个项目是否包含KIDNEY

如果您需要经常进行类似的类似查询,您应该考虑重新组织数据,并按照KIDNEY等类别分组字典:

{
    "KIDNEY": ["769P_KIDNEY","786O_KIDNEY"],
    "NERVOUS_SYSTEM": ["LN18_CENTRAL_NERVOUS_SYSTEM"]
}

在这种情况下,每个"按类别"查找需要"常数"时间。

答案 1 :(得分:1)

您可以使用set代替list,因为它会在固定时间内执行查找。

from bisect import bisect_left
def bi_contains(lst, item):
    """ efficient `item in lst` for sorted lists """
    # if item is larger than the last its not in the list, but the bisect would 
    # find `len(lst)` as the index to insert, so check that first. Else, if the 
    # item is in the list then it has to be at index bisect_left(lst, item)
    return (item <= lst[-1]) and (lst[bisect_left(lst, item)] == item)


略微修改上面的代码会给你很好的效率。

这里列出了Python中可用的数据结构以及时间复杂性 https://wiki.python.org/moin/TimeComplexity