【问题标题】:Removing sublist from list if it contains given elements如果包含给定元素,则从列表中删除子列表
【发布时间】:2017-11-11 02:51:08
【问题描述】:

我有一个这样的列表 [1]:

[['a1', 'b1', 'c1'], ['a1', 'b1', 'c2'], ['a1', 'b1', 'c3'], 
 ['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'], 
 ['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'], 
 ['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'], 
 ['a2', 'b2', 'c1'], ['a2', 'b2', 'c2'], ['a2', 'b2', 'c3'], 
 ['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'], 
 ['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'], 
 ['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'], 
 ['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']]

还有一个像这样的[2]:

[['a1', 'b1'], ['a2', 'b2']]

我想删除 [1] 的子列表,其中包含 [2] 的任一子列表中的所有元素。换句话说,如果 [1] 的子列表包含 'a1' and 'b1''a2' and 'b2',则应将其删除(仅适用于字符串的完全匹配)。

列表 [1] 应如下所示:

[['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'], 
 ['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'], 
 ['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'], 
 ['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'], 
 ['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'], 
 ['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'], 
 ['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']]

我试过类似的方法:

https://stackoverflow.com/a/17934810/6278576

但是,当满足多个条件时,我不知道如何调整它以从列表中删除子列表。

如何做到这一点?

【问题讨论】:

    标签: python list


    【解决方案1】:

    您可以使用一个函数来过滤您的列表中的第二个列表中的每组项目。

    def filterall(list_in, *filter_iterables):
        out = list_in.copy()
        for it in filter_iterables:
            out = [x for x in out if not all(i in x for i in it)]
        return out
    
    x = [['a1', 'b1', 'c1'], ['a1', 'b1', 'c2'], ['a1', 'b1', 'c3'], 
     ['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'], 
     ['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'], 
     ['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'], 
     ['a2', 'b2', 'c1'], ['a2', 'b2', 'c2'], ['a2', 'b2', 'c3'], 
     ['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'], 
     ['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'], 
     ['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'], 
     ['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']]
    
    filterall(x, ['a1', 'b1'], ['a2', 'b2'])
    # returns:
    [['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'],
     ['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'],
     ['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'],
     ['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'],
     ['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'],
     ['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'],
     ['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']]
    

    【讨论】:

      【解决方案2】:

      您仍然可以使用列表推导式,只需嵌套您的谓词:

      list1 = [['a1', 'b1', 'c1'], ['a1', 'b1', 'c2'], ['a1', 'b1', 'c3'], 
               ['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'], 
               ['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'], 
               ['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'], 
               ['a2', 'b2', 'c1'], ['a2', 'b2', 'c2'], ['a2', 'b2', 'c3'], 
               ['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'], 
               ['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'], 
               ['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'], 
               ['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']]
      list2 = [['a1', 'b1'], ['a2', 'b2']]
      
      print [sublist1 for sublist1 in list1 if not any([all([item2 in sublist1 for item2 in sublist2]) for sublist2 in list2])]
      

      为我打印:

      [['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'],
       ['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'], 
       ['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'], 
       ['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'], 
       ['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'], 
       ['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'], 
       ['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']]
      

      如果您想在更大的数据(即非常长的列表)上运行此操作,您可能需要将列表转换为集合以允许更快的交叉点。

      【讨论】:

        【解决方案3】:

        filter + lambda + all 组合

        l1 = [['a1', 'b1', 'c1'], ['a1', 'b1', 'c2'], ['a1', 'b1', 'c3'], ['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'], ['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'], ['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'], ['a2', 'b2', 'c1'], ['a2', 'b2', 'c2'], ['a2', 'b2', 'c3'], ['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'], ['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'], ['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'], ['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']]
        l2 = [['a1', 'b1'], ['a2', 'b2']]
        list(filter(lambda x: all(not all(j in x for j in i) for i in l2), l1))
        

        输出:

        [['a1', 'b2', 'c1'],
         ['a1', 'b2', 'c2'],
         ['a1', 'b2', 'c3'],
         ['a1', 'b3', 'c1'],
         ['a1', 'b3', 'c2'],
         ['a1', 'b3', 'c3'],
         ['a2', 'b1', 'c1'],
         ['a2', 'b1', 'c2'],
         ['a2', 'b1', 'c3'],
         ['a2', 'b3', 'c1'],
         ['a2', 'b3', 'c2'],
         ['a2', 'b3', 'c3'],
         ['a3', 'b1', 'c1'],
         ['a3', 'b1', 'c2'],
         ['a3', 'b1', 'c3'],
         ['a3', 'b2', 'c1'],
         ['a3', 'b2', 'c2'],
         ['a3', 'b2', 'c3'],
         ['a3', 'b3', 'c1'],
         ['a3', 'b3', 'c2'],
         ['a3', 'b3', 'c3']]
        

        【讨论】:

          【解决方案4】:

          嗯,你可以很容易地用 for 嵌套循环做到这一点......但我猜你的老师正试图让你思考如何优化它。

          我会对每个数组进行排序。首先每个包含字符串,然后是包含数组的顶级数组。

          这样,任务就变成了 m.log(n),其中 m 是第二个数组的大小,n 是第一个数组的大小。

          这对你有意义吗?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-06-27
            • 2020-06-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-08-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多