作者:深厚科学修养的文艺青年 | 来源:互联网 | 2023-07-30 10:51
我需要除去在字符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
一次循环,但多次检查string2
using 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``