2014-03-06 197 views
2

我有一个list l=['abc','abcdef','def','defdef','polopolo'] 即时消息试图删除其超字符串已经在列表中的字符串。在这种情况下,结果应该是:python从字符串列表中删除子字符串

['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

+0

我现在非常愚蠢的错误在你解释它。 :)谢谢 – user2058724

+0

不客气;) – thefourtheye

回答

3
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 mentions in the comments加速它的一个非常小的,通过排序列表,如果你想保留重复的字符串,那么你就可以做到这一点

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'] 
+0

尝试用'['abc','defghi''abcdef','def','defdef','defdef','polopolo']' –

+0

@AshwiniChaudhary我得到' 'defghiabcdef','defdef','polopolo']'。那是错的吗? – thefourtheye

+0

杜!在'defghi'之后错过了','BTW'defdef'计数减少到1. –

相关问题