从字符串列表中删除子字符串。

7

我有一个列表

l = ['abc', 'abcdef', 'def', 'defdef', 'polopolo']

我正在尝试删除已经在列表中存在的超级字符串。在这种情况下,结果应该是:
['abcdef', 'defdef', 'polopolo']

我已经编写了代码:
l=['abc','abcdef','def','defdef','polopolo']
res=['abc','abcdef','def','defdef','polopolo']
for each in l:
    l1=[x for x in l if x!=each]
    for other in l1:
        if each in other:
            res.remove(each)

但它似乎无法正常工作。我已经了解到在迭代列表时无法从中删除。因此,使用复制品res,而l是我的原始列表。


1
如果你在 res.remove(each) 后立即跳出循环,你的代码就可以正常工作了 :) 为了更高效地实现这一点,请查看我的答案 :) - thefourtheye
我犯了一个相当愚蠢的错误,现在你已经解释清楚了。 :) 谢谢 - user2058724
1个回答

9
l=['abc','abcdef','def','defdef','polopolo']
print [j for i, j in enumerate(l) if all(j not in k for k in l[i + 1:])]
# ['abcdef', 'defdef', 'polopolo']

我们可以在之前对列表进行排序,以稍微加快速度。
l = sorted(l, key = len)
print [j for i, j in enumerate(l) if all(j not in k for k in l[i + 1:])]

正如@Ashwini Chaudhary在评论中提到的那样,如果您想保留重复的字符串,则可以这样做

l = ['abc','defghi' 'abcdef','def','defdef','defdef', 'polopolo']
l = sorted(l, key = len)
print [j for i,j in enumerate(l) if all(j == k or (j not in k) for k in l[i+1:])]
# ['defdef', 'defdef', 'polopolo', 'defghiabcdef']

尝试使用 ['abc','defghi' 'abcdef','def','defdef','defdef', 'polopolo'] - Ashwini Chaudhary
@AshwiniChaudhary 我得到了 ['defghiabcdef', 'defdef', 'polopolo']。这是错误的吗? - thefourtheye
啊!在“defghi”之后错过了‘,’。顺便说一句,“defdef”的计数减少到1了。 - Ashwini Chaudhary
@AshwiniChaudhary,感谢你检查代码并提出建议,朋友 :) - thefourtheye
1
是的 @thefourtheye.. 你的解决方案可行,但你能指出为什么我的解决方案不行吗? - user2058724
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接