如何从Python列表中删除子字符串。

7
有没有什么列表推导技巧可以更好地得到以下所需结果?
a = ['hello', 'world', 'hello world', 'hello world how are', 'hello india']

final = set()
for i in a:
    for j in [x for x in a if x != i]:
        if i in j:
            final.add(i)
list(set(a)^final)

你可以在 if 语句中加入 break - 没有必要将任何项添加到 final 中超过一次。 - jasonharper
这是一个非常受欢迎的问题,所以我认为我可能是唯一一个笨蛋,但是...请找到一种方式用问题来表明你想要什么,而不是让我们从你的代码中去猜测。这可能只需要打印所需的输出,因为你似乎对结果很满意,只是对方法不满意。 - JL Peyret
2个回答

4

更短并不一定更好:

print([x for x in a if not any(x in j for j in a if x != j)])

在最终列表中删除重复项(类似于问题的行为):

print(list(set(x for x in a if not any(x in j for j in a if x != j))))

1
你的代码在输出中保留了初始列表中存在的重复项,而 OP 的解决方案则不会这样做。 - kuro
你也可以使用 filter,它基本上是相同的:list(filter(not any(element in other and element != other for other in a), set(a))) - Artog

2
另一种方法:

另外一个方案:

set([i for i in a if not any(set(i) < set(j) for j in a)])

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