我写了一个函数来根据以下条件检查字符串:
棘手的部分是这些列表真的很长。因此,为了提高效率,列表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) { }
基于我的测试数据具有相同的运行时间。
我想更明确的问题是,我的第一个代码实际上会运行,直到它找到满足其标准并且中断的“第一”元素。或者它仍在运行所有元素,如第二个代码。
答案 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)
首先,您的list1
和list2
不应该是列表,而是设置。这是因为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)