Python 给定一个字符串列表,确定一个字符串是否是另一个字符串的前缀

Python 给定一个字符串列表,确定一个字符串是否是另一个字符串的前缀,python,Python,我想写一个Python函数,检查一个字符串是否是另一个字符串的前缀字符串;不是另一个的任意子字符串;必须是前缀。如果是,则返回True。比如说, list = ['abc', 'abcd', 'xyx', 'mno'] 返回True,因为'abc'是'abcd'的前缀 list = ['abc', 'xyzabc', 'mno'] 返回False 我尝试了startwith()和列表理解,但效果不太好。 感谢您的帮助或指点。让我们首先对给定的lstw.r.t字符串长度进行排序,因为已知的事实

我想写一个Python函数,检查一个字符串是否是另一个字符串的前缀字符串;不是另一个的任意子字符串;必须是前缀。如果是,则返回True。比如说,

list = ['abc', 'abcd', 'xyx', 'mno']
返回
True
,因为
'abc'
'abcd'
的前缀

list = ['abc', 'xyzabc', 'mno']
返回
False

我尝试了
startwith()
和列表理解,但效果不太好。
感谢您的帮助或指点。

让我们首先对给定的
lst
w.r.t字符串长度进行排序,因为已知的事实是子字符串的长度总是小于或等于原始字符串,因此在排序后,我们在列表的开头有长度较小的字符串,然后我们迭代排序列表,将当前元素与它旁边的所有元素进行比较,这个小优化将降低问题的复杂性,因为现在我们不必将每个元素与每个其他元素合并

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))

使用
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)
这并不是非常优化,但取决于需要处理的数据量,代码相当优雅(且简短);在您的用例中,这可能胜过速度


这假设列表中没有纯重复(但在示例中没有)。请包含您尝试过的代码。它有用吗?如果没有,什么不起作用?
一个字符串是另一个字符串的前缀字符串
?你说的是哪一个字符串?另外,最好不要给一个对象命名
list
,你会用相同的名称来屏蔽内置项,目的是找出列表中的任何字符串是否是同一列表中任何其他字符串的前缀?肯定是的重复。请在发帖前研究一下。我不认为前缀的长度严格小于原始字符串。例如,
abc
abc
的前缀。但是,在给定的示例中,用户在第一种情况下将
abc
匹配到
abc
,而不将
abc
匹配到
abc
,否则在任何情况下答案都是正确的,我同意
abc
abc
的前缀,但我已针对所问问题做出了这一假设@geckonSo你只假设你的解决方案适用于问题中公布的确切列表吗?谢谢你的解决方案。需要解释。适用于我的简单案例,请参阅上面的新要求。非常感谢。谢谢你的解决方案。谢谢你的解决方案。
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