删除包含子列表的列表

问题描述

是否可以从包含子列表的列表中删除列表?

让我们说从a到e有5个元素。

我发现以下尺寸从0到5的所有组合:

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.1.1/d3.min.js"></script>

现在让我们说我要删除其中一些包含子列表的组合:

all_combinations = [[],['a'],['b'],['c'],['d'],['e'],['a','b'],'c'],'d'],'e'],['b',['c',['d','b','c','d','e']]

是否有一种简单的方法?我应该只剩下不包含这些子列表的组合。我只应该列出a和c不在一起,c和d不在一起,b和e不在一起的列表。

编辑:想得到这样的输出

sublists = [['a','e']]

解决方法

您可以使用sets来查看sublists的子列表中是否包含all_combinations中的项目的完整列表:

>>> [sl for sl in all_combinations if not any(set(e)<=set(sl) for e in sublists)]
[[],['a'],['b'],['c'],['d'],['e'],['a','b'],'d'],'e'],['b','c'],['c',['d','b','d','e']]

>>> _==valid_combinations
True
,

尝试一下:

result = [item for item in all_combinations if item not in sublists] 
,

一种可能的方法是使用集合,尤其是函数issuperset,以检查列表是否包含另一个列表的所有元素。因此,以下列表推导返回a的所有元素all_combinations,其中不包含b中任何sublists的每个元素

[a for a in all_combinations if all(not set(a).issuperset(set(b)) for b in sublists)]