我想编写一个Python函数来检查一个字符串是否是另一个字符串的前缀字符串;不是另一个的任意子串;必须是前缀。如果是,则返回True。例如,
list = ['abc', 'abcd', 'xyx', 'mno']
返回True
,因为'abc'
是'abcd'
的前缀。
list = ['abc', 'xyzabc', 'mno']
返回False
我尝试了startwith()
和列表理解,但它并没有完全奏效。
感谢任何帮助或指示。
答案 0 :(得分:2)
让我们首先对字符串的给定lst
wrt长度进行排序,因为已知的事实是子字符串的长度始终小于或等于原始字符串,因此在排序之后我们有一些长度较小的字符串列表的开头,然后我们遍历排序列表,将当前元素与其旁边的所有元素进行比较,这种小优化将降低问题的复杂性,因为现在我们不必将每个元素与所有其他元素。
lst1 = ['abc', 'abcd', 'xyx', 'mno']
lst2 = ['abc', 'xyzabc', 'mno']
lst3 = ["abc", "abc"]
def check_list(lst):
lst = list(set(lst)) #if you want to avoid redundant strings.
lst.sort(key = lambda x:len(x))
n = len(lst)
for i in xrange(n):
for j in xrange(i+1, n):
if lst[j].startswith(lst[i]):
return True
return False
print check_list(lst1)
print check_list(lst2)
print check_list(lst3)
>>> True
>>> False
>>> False #incase you use lst = list(set(lst))
答案 1 :(得分:1)
使用itertools
import itertools
list1 = ["abc", "xyz", "abc123"]
products = itertools.product(list1, list1)
is_substringy = any(x.startswith(y) for x, y in products if x != y)
这并未经过优化,但根据您需要处理的数据量,代码相当优雅(简短);这可能胜过你的用例速度。
这假设您在列表中没有重复(但在您的示例中,您没有这样做)。
答案 2 :(得分:1)
import itertools
mlist = ['abc', 'abcd', 'xyx', 'mno']
#combination of list elements, 2-by-2. without repetition
In [638]: for i,j in itertools.combinations(mlist,2):
print (i,j)
.....:
('abc', 'abcd')
('abc', 'xyx')
('abc', 'mno')
('abcd', 'xyx')
('abcd', 'mno')
('xyx', 'mno')
#r holds the final result. if there is any pair where one is a prefixed of another
r=False
In [639]: for i,j in itertools.combinations(mlist,2):
r = r or i.startswith(j) # if i is the prefix of j. logical or
r = r or j.startswith(i) # if j is the prefix of i
.....:
In [640]: r
Out[640]: True