2017-06-15 142 views
-4

我试图删除Python列表中的多余句子。一个句子可以包含在另一个句子中,我想保留最长的句子。删除Python中的多余句子

E.g

my_list = ['Her name is Laura and she\'s from Texas','October','He owns a 
    dog and a cat', 'Her name is Laura', 'He owns a dog', 'Marie will turn 
    eighteen in October'] 

处理后:

my_list = ['Her name is Laura and she\'s from Texas','He owns a 
    dog and a cat', 'Marie will turn eighteen in October'] 
+0

请提供您已经尝试过的代码 – dhdavvie

+0

简单的字符串比较真的能解决您的问题吗?什么,如果有句“他拥有一只猫”,“他拥有一只狗”,“他拥有一只猫和一只狗”?如果你不能分析内容,你的结果会很奇怪,我认为 – am2

回答

3

A(略好于)二次方程式解答,检查下一个最小项是在随后的大串子串。

my_list = sorted(my_list, key=lambda x: -len(x)) # sort in descending order of length 

indices_to_delete = [] 
for i, x in enumerate(my_list[:]): 
    for j, y in enumerate(my_list[:][i:]): 
     if x in y: 
      indices_to_delete.append(i) 
      break 

my_list = [x for i, x in enumerate(my_list) if i not in indices_to_delete] 

这样做的一个缺陷是方法是对数据进行排序。如果你不希望发生这种情况,请不要使用它。

+0

这是一个简单的解决方案,这是真的。但我担心,这可能会更复杂一点。如果,f.e.有句话说:“他拥有一只猫”,“他拥有一只狗”,“他拥有一只猫和一只狗”,你不会消除“他拥有一只狗”。我认为,分析内容是必要的。而对于这个python可能是错误的工具,也许在Prolog或其他类似的东西中找到方法会更容易。 – am2

+0

@ am2 OP在他的问题中没有提供任何证据表明他需要处理这种情况,或者我错过了什么? –

+0

我知道,那就是为什么我把答案标记为有用。但问题依然存在。你可以尝试使用正则表达式或其他任何东西。但f.e.对我来说“十月”和“十月份......”不是多余的,只有文字听起来很相似。这不是你的问题,而是OP的概率。 “ANDY非法”,“SANDY生病”使“SANDY违法”? – am2

0

该方法计算每个字符串是列表中每个其他字符串的子字符串的次数,并消除任何多于一个的子字符串。

my_list = [ 
    'Her name is Laura and she\'s from Texas', 'October', 
    'He owns a dog and a cat', 'Her name is Laura', 'He owns a dog', 
    'Marie will turn eighteen in October' 
] 

redundant_counts = [ 
    len([sent for other_sent in my_list if sent in other_sent]) for sent in my_list 
] 

my_list = [ 
    sent for count, sent in zip(redundant_counts, my_list) if count == 1 
]