列表看起来像:
cell_lines = ["LN18_CENTRAL_NERVOUS_SYSTEM","769P_KIDNEY","786O_KIDNEY"]
随着我对正则表达式的探讨,除了循环遍历每个元素并执行搜索之外,我无法找到一种令人信服的方式来搜索列表中的单个字符串。
如何以有效的方式检索包含“KIDNEY”的索引(因为我有一个长度为千的列表)?
答案 0 :(得分:1)
[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