python中的’in’运算符功能
我需要除去在字符string1中存在的string2。在这里string1,string2只有小写字符 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``