背景
有一个list,其中的元素存在之间相互包含的关系,即元素A可能是原始B的子串。举个例子:
输入list a=['我是卖麻辣烫的小男孩', '小男孩', '麻辣烫', '华中科技大学','大学']
,希望返回的结果是['我是卖麻辣烫的小男孩', '华中科技大学']
解法
由于长字符串不可能被短字符串所包含,即长字符串不可能是短字符串的子串,那么只需要按照字符串长度降序排序,并设立一个新的list(比如new_a
),从长->短,依次判断排序后的字符串是否是new_a
中元素的子串。
具体代码:
def get_max_len_string(input_list):
input_list.sort(key=lambda x: len(x), reverse=True)#降序排序,因为最长的字符串是不可能是其他字符串的子串
out, filter_list = [], []
for s in input_list:
mask_list = [s in o for o in out]
if not any(mask_list):#any函数全部为false才返回false
out.append(s)
else:
# 记录是因为那个元素的存在导致被过滤
been_contained_index = mask_list.index(True)
large_word = out[been_contained_index]
filter_list.append(s)
return out, filter_list
a = ['我是卖麻辣烫的小男孩', '小男孩', '麻辣烫', '华中科技大学', '大学']
new_a = get_max_len_string(a)
print("new list=", new_a[0])
print("abandoned elements=", new_a[1])
运行结果:
new list= ['我是卖麻辣烫的小男孩', '华中科技大学']
abandoned elements= ['小男孩', '麻辣烫', '大学']