从字符串列表中删除短重叠字符串

Jes*_*ABI 4 python string list

我有一个字符串列表:mylist = ["Hanks", "Tom Hanks","Tom","Tom Can"],我需要删除作为列表中另一个字符串的子字符串的较短字符串。

例如,在上述情况下,输出应为:[“Tom Hanks”,“Tom Can”]。

我在 python 中做了什么:

mylist = ["Hanks", "Tom Hanks","Tom","Tom Can"]
newlst = []
for x in mylist:
    noexist = True
    for j in mylist:
        if x==j:continue
        noexist = noexist and not(x in j)         
    if (noexist==True):
        newlst.append(x)
print(newlst)            
Run Code Online (Sandbox Code Playgroud)

该代码运行良好。我怎样才能让它变得高效?

Ehs*_*san 5

  • 如果输出中的顺序并不重要(将','字符替换为列表字符串中未出现的字符):

    mylist = ["Hanks", "Tom Hanks","Tom","Tom Can"]
    mylist.sort(key = len)
    newlst = []
    for i,x in enumerate(mylist):
        if x not in ','.join(mylist[i+1:]):
            newlst.append(x)
    
    Run Code Online (Sandbox Code Playgroud)

    列表理解替代方案(可读性较差):

    mylist = ["Hanks", "Tom Hanks","Tom","Tom Can"]
    mylist.sort(key = len)
    newlst = [x for i,x in enumerate(mylist) if x not in ','.join(mylist[i+1:])]
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    ['Tom Can', 'Tom Hanks']
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果你想保留订单:

    mylist = ["Hanks", "Tom Hanks","Tom","Tom Can"]
    mylist_sorted = mylist.copy()
    mylist_sorted.sort(key = len)
    newlst = [x for i,x in enumerate(mylist_sorted) if x not in ','.join(mylist_sorted[i+1:])]
    newlst = [x for x in mylist if x in newlst]
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    ['Tom Hanks', 'Tom Can']
    
    Run Code Online (Sandbox Code Playgroud)