返回True并在列表中的第一项匹配时停止,如果没有项匹配则返回false

时间:2018-01-01 19:12:22

标签: python loops

我写了一个函数来根据以下条件检查字符串:

  • 检查字符串中的任何单词是否在列表1中。
  • 如果列表1中的字符串,则返回位置以查看其旁边的项目 字符串在列表2中。
  • 如果在列表1和列表2中,则返回True。
  • 否则返回False。

棘手的部分是这些列表真的很长。因此,为了提高效率,列表2中的第一个匹配将返回True并继续下一个字符串。

下面是我窒息的代码,但我怀疑它是按预期工作的。效率确实是她的关键。我尝试创建列表1和列表2的完整组合,然后循环,但似乎有点疯狂循环每个字符串超过1亿次。

第一个代码:

def double_loop(words):
    all_words = words.split()
    indices = [n for n,x in enumerate(allwords) if x in list1]
    if len(indices) != 0:
        indices2 = [i for i in indices[:-1] if all_words[i+1] in list2]
        if len(indices2) != 0:
            return True
        else:
            return False
    else:
        return False

我不确定上面的代码是否基于我上面的逻辑工作。相比之下;

第二代码:

public App(IPlatformInitializer initializer = null) : base(initializer) { }

基于我的测试数据具有相同的运行时间。

我想更明确的问题是,我的第一个代码实际上会运行,直到它找到满足其标准并且中断的“第一”元素。或者它仍在运行所有元素,如第二个代码。

3 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,那么您将使用预先计算的索引实现最快的查找时间。此索引是列表1中所有项的集合,其中以下项位于列表2中。

# Build index, can be reused
index = set(item1 for i, item1 in enumerate(list1[:-1]) if list1[i+1] in list2)

def double_loop(words):
  return any(word in index for word in words.split())

无论list1和list2有多长,索引查找都将在恒定时间内完成。当list1和list2变得更长时,索引构建将花费更长的时间。请注意,当list1很大时,将list2设置为set可能会加快索引构建。

答案 1 :(得分:0)

首先,您的list1list2不应该是列表,而是设置。这是因为set lookup是哈希查找,列表查找是线性搜索。

并且您不需要嵌套循环。

def single_loop(words):
    all_words = words.split()
    for w1, w2 in ((all_words[i],all_words[i+1]) for i in range(len(all_words)-1)):
        if w1 in set1 and w2 in set2:
            return True
    else:
        return False

答案 2 :(得分:0)

您可以通过在单个列表理解中组合您的条件来迭代主列表一次:

list1 = ['h', 'e', 'l', 'l', 'o']
list2 = ['a', 'h', 'e', 'p', 'l', 'o']
set_list2 = set(list2)

check = [item for x, item in enumerate(list1) if item in set_list2 and list2[x+1] == item]

如果您希望功能短路:

def check(list1, list2):
    set_list2 = set(list2)
    for x, item in enumerate(list1):
        if item in set_list2 and list2[x+1] == item:
            return True
    return False

a = check(list1, list2)