一种可能的方法是使用集合,特别是函数
有没有办法从包含子列表的列表中删除列表?
假设我有从a到e的5个元素。
我在下面找到了从0号到5号的所有组合:
all_combinations = [[], ['a'], ['b'], ['c'], ['d'], ['e'], ['a', 'b'], ['a', 'c'], ['a', 'd'], ['a',
'e'], ['b', 'c'], ['b', 'd'], ['b', 'e'], ['c', 'd'], ['c', 'e'], ['d', 'e'],
['a', 'b', 'c'], ['a', 'b', 'd'], ['a', 'b', 'e'], ['a', 'c', 'd'], ['a', 'c',
'e'], ['a', 'd', 'e'], ['b', 'c', 'd'], ['b', 'c', 'e'], ['b', 'd', 'e'],
['c', 'd', 'e'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'e'], ['a', 'b',
'd', 'e'], ['a', 'c', 'd', 'e'], ['b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']]
现在假设我想删除一些包含子列表的组合:
sublists = [['a', 'c'], ['c', 'd'], ['b', 'e']]
有简单的方法吗?我应该只剩下不包含这些子列表的组合。我应该只得到a和c不在一起、c和d不在一起以及b和e不在一起的列表。
编辑:想要得到这样的输出:
valid_combinations = [[], ['a'], ['b'], ['c'], ['d'], ['e'], ['a', 'b'],
['a', 'd'], ['a', 'e'], ['b', 'c'], ['b', 'd'],
['c', 'e'], ['d', 'e'], ['a', 'b', 'd'],
['a', 'd', 'e']]
您可以使用集合查看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'], ['a', 'd'], ['a', 'e'], ['b', 'c'], ['b', 'd'], ['c', 'e'], ['d', 'e'], ['a', 'b', 'd'], ['a', 'd', 'e']]
>>> _==valid_combinations
True
试试这个:
result = [item for item in all_combinations if item not in sublists]
issuperset
来检查一个列表是否包含另一个列表的所有元素。因此,下面的列表理解返回all_combinations
的所有元素a
,这些元素不包含sublists
中任何b
的每个元素
[a for a in all_combinations if all(not set(a).issuperset(set(b)) for b in sublists)]