我需要删除string1
中存在于string2
中的字符。这里string1
和string2
仅具有小写字符a-z,给定的条件是string1
的长度每次都会更大
我正在使用in
操作符:
def removeChars (string1, string2):
for char in string2:
if char in string1:
string1 = string1.replace(char, '')
return string1
但是我读到一篇关于堆栈溢出的文章,上面说:
For container types such as list, tuple, set, frozenset, dict, or collections.deque, the expression
x in y
is equivalent toany(x is e or x == e for e in y)
.
这意味着in
操作符正在后台使用for
循环
所以我的问题是,在我的代码中的{{CD8}}循环中,我是否应该考虑嵌套^ {< CD8>}循环,因为^ {< CD6>}运算符在后台使用^ {< CD8>}循环吗?如果是,该计划的时间复杂度是多少
您确实有一个嵌套的for循环,但是,它不需要完全执行(平均而言),只需要在达到匹配之前执行
所以最好的情况是O(n),如果每个列表的所有元素都匹配,那么对于列表1的每个元素,它需要内部循环的一个步骤来确定它匹配
最坏的情况是O(n^2),如果只有列表2的最后一个元素匹配,则外部循环的每个迭代将需要测试内部循环n次
至少,我是这样理解的,但不是专家
当
in
相当于一个循环时,它必须“遍历”迭代器并依次比较每个项这意味着每个循环都是
O(n)
,因此对于2个级别,这是O(n²)
https://wiki.python.org/moin/TimeComplexity
请注意,这里实际上有3个循环,因为
replace
也将遍历字符串由于如果未找到
char
,replace不会引发任何错误,因此只需在不首先测试char in string1
的情况下执行此操作就更简单了in
不一定在幕后使用循环。例如:如果要循环
r
,则需要相当长的时间,因此显然不会发生这种情况in
基本上(在幕后)调用对象的__contains__
方法。对于某些迭代器,它实际上会“循环”遍历所有内容,但情况并非总是如此此示例与调用基本相同:
正如在注释中指出的那样,
str
对象比普通循环具有更智能的算法,正如您所看到的here另见示例答案here
见文件here
因为现实世界中的场景可能意味着
string1
可以任意长,但是要删除的字符集有限且很小,所以将不在string2
中的所有字符相加可能会更有效。大概是这样的:这将涉及只在
string1
上循环一次,但使用in
对string2
进行多次检查。这可以进一步简化(以避免对结果进行+=
循环):相关问题 更多 >
编程相关推荐