2017-06-15 166 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 
]