Python识别字符串集中的后缀
Posted
技术标签:
【中文标题】Python识别字符串集中的后缀【英文标题】:Python Identifying Suffix within set of strings 【发布时间】:2015-04-23 19:29:40 【问题描述】:在CheckIO
上做一个练习,我想知道为什么这不起作用。给定一组字符串,如果任何字符串是集合中任何其他字符串的后缀,我将尝试返回 True。否则为假。使用 itertools 我首先在元组中生成必要的排列。然后对于每个元组(每个 i),我想看看第二个元组是否在第一个元组的末尾(选项 1)。另一种方法是使用 .endwith 函数(选项 2),但两者都不适合我。为什么这两个选项有缺陷?
import itertools
def checkio(words_set):
for i in itertools.permutations(words_set, 2):
#option1 ---- if i[1] in i[0][-len(i[1]):]:
#option2 ---- if i[0].endswith(i[1]):
return True
else:
return False
例子:
checkio("hello", "lo", "he") == True
checkio("hello", "la", "hellow", "cow") == False
我知道这可以作为答案。但只是想知道为什么我的原始方法不会采用。
def checkio(words_set):
for w1 in words_set:
for w2 in words_set:
if w1.endswith(w2) and w1 != w2:
return True
return False
【问题讨论】:
这是一个练习,所以我只建议考虑排序。 【参考方案1】:return False
应该在 for 循环的末尾,否则函数将在每次第一次比较时返回 True/False,并忽略所有后续比较:
import itertools
def checkio(words_set):
for i in itertools.permutations(words_set, 2):
if i[0].endswith(i[1]):
return True
return False
【讨论】:
【参考方案2】:由于是练习,我不会给你完整的答案,但是你确定你真的要在else
子句中的return False
吗?
【讨论】:
【参考方案3】:这是因为您在第一次检查后就return False
。如果失败,它将返回False
,您需要将其从for
循环中删除!
但作为一种更 Pythonic 的方式,您可以在 any
函数中使用 combinations
和生成器表达式:
>>> from itertools import combinations
>>> s="hello", "lo", "he"
>>> any(i.endswith(j) or j.endswith(i) for i,j in (combinations(s,2)))
True
>>> s2="hello", "la", "hellow", "cow"
>>> any(i.endswith(j) or j.endswith(i) for i,j in (combinations(s2,2)))
False
【讨论】:
« 这是错误的,因为你总是检查 i[0].endswith(i[1]),但你需要 i[1].endswith(i[0])。 » — itertools.permutations 为您完成。 @Arkanosis 是的!我错过了!谢谢提醒!以上是关于Python识别字符串集中的后缀的主要内容,如果未能解决你的问题,请参考以下文章