欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

过滤掉list中被其他元素所包含的元素

程序员文章站 2024-01-16 15:44:59
背景有一个list,其中的元素存在之间相互包含的关系,即元素A可能是原始B的子串。举个例子:输入list a=['我是卖麻辣烫的小男孩', '小男孩', '麻辣烫', '华中科技大学','大学'],希望返回的结果是['我是卖麻辣烫的小男孩', '华中科技大学']解法由于长字符串不可能被短字符串所包含,即长字符串不可能是短字符串的子串,那么只需要按照字符串长度降序排序,并设立一个新的list(比如new_a),从长->短,依次判断排序后的字符串是否是new_a中元素的子串。具体代码:...

背景

有一个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= ['小男孩', '麻辣烫', '大学']

本文地址:https://blog.csdn.net/ljp1919/article/details/111950451