python中的’in’运算符功能

我需要除去在字符string1中存在的string2。在这里string1string2只有小写字符 az 在给定的条件下,string1每次的长度都会更大。

我正在使用in运营商:

def removeChars (string1, string2):
    for char in string2:
        if char in string1:
            string1 = string1.replace(char, '')
    return string1

但我在 Stack Overflow 上读到一个答案,上面写着:

这意味着in操作员for在幕后使用了一个循环。

所以我的问题是,在for我的代码循环中,我应该考虑使用嵌套for循环,因为in操作员for在后台使用循环吗?如果是,这个程序的时间复杂度是多少?

回答

in不一定在幕后使用循环。例如:

r = range(100000000000)
print(333 in r)  # prints True immediately without looping

如果你要循环r它会花费很长时间,所以很明显这不会发生。

in基本上调用(在幕后)对象的__contains__方法。对于某些迭代器,它实际上会“循环”所有内容,但情况并非总是如此。

这个例子与调用基本相同:

r.__contains__(333)

正如评论中指出的那样 -str对象特别具有比普通循环更智能的算法,正如您在此处看到的

另请参阅此处的示例答案

并在此处查看文档

因为现实世界的场景可能意味着string1可以任意长,但要删除的字符将是一个有限的小集合,将所有不在string2. 像这样的东西:

def removeChars (string1, string2):
result = ''
for char in string1:
if char not in string2:
result += char
return result

这将只涉及string1一次循环,但多次检查string2using in。这可以进一步简化(以避免+=循环结果):

def removeChars (string1, string2):
return ''.join(char for char in string1 if char not in string2)
  • *nnooooo*。这可能会导致灾难性的二次行为,循环中的 `result += char` 将是二次时间,尽管 CPython 运行时中有一个优化可以避免这种情况,不建议依赖它,你应该始终使用`list`,然后在最后使用`''.join`
  • 正如在另一个答案的评论中提到的,字符串已经有一种方法可以一次删除任意多个字符:``str.translate``

以上是python中的’in’运算符功能的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>