在列表中,有没有一种Pythonic的方法来过滤字符串的子串?
在列表中,有没有一种Pythonic的方法来过滤字符串的子串?
我有一个包含以下字符串的列表。
candidates = ["Hello", "World", "HelloWorld", "Foo", "bar", "ar"]
我希望将列表过滤为["HelloWorld", "Foo", "Bar"]
,因为其他字符串都是子字符串。我可以像这样做,但不认为它快速或优雅。
def filter_not_substring(candidates): survive = [] for a in candidates: for b in candidates: if a == b: continue if a in b: break else: survive.append(a) return survive
有没有更快的方法?
有没有一种Pythonic的方法来过滤列表中的字符串子串?
问题的出现原因:
问题的出现是因为用户想要找到一种在列表中过滤字符串子串的Pythonic方法。用户已经尝试了一些方法,但是想知道是否有更好的方式来解决这个问题。
解决方法:
用户提供了一个可能的解决方法,使用了列表推导式和any()函数。代码首先定义了一个候选列表(candidates),然后使用列表推导式筛选出不是其他字符串的子串的字符串。具体实现是通过遍历候选列表中的每个字符串,检查是否存在其他字符串是其子串,并且其他字符串的长度大于该字符串的长度。如果存在这样的字符串,则该字符串不会被包含在结果列表(result)中。
用户还提供了其他几种解决方法,包括使用循环和break语句、使用排序和长度比较等。这些方法在性能上有所差异,但用户发现最初提供的解决方法在速度上是最快的。
用户还注意到了一些优化的可能性,如在循环中进行长度检查和子串检查之前进行短路评估,以及使用预排序的输入列表。然而,这些优化方法在实际测试中并没有带来明显的性能提升。
最后,用户还提到了一些其他用户对的问题,包括any()和all()函数的性能开销,列表推导式与循环和break语句的比较等。
用户提供了一种Pythonic的解决方法,并探讨了其他可能的优化方法和讨论。这对于需要在列表中过滤字符串子串的Python开发者来说是一个有价值的参考。