将子列表与list_of_lists中的其他子列表进行比较时删除超集
输入:
my_list = [['cat','bat'],['sat','rat','mat'],['cat','bat','hat'],['pat','mat']]
此处[' cat',' bat']是[' cat',' bat','帽子']所以我需要从my_list中删除超集[' cat',' bat',' hat']
期望的输出应该是:
my_new_list = [['cat','bat'],['sat','rat','mat'],['pat','mat']]
我发现了一个类似的线程但是无法实现相同的代码来比较子列表。任何人都可以帮我这个吗?
def match(my_list[],my_list[]):
matches = set(my_list[]).issuperset()
return [remove(my_list[]) for sublist in my_list if matches (sublist)]
答案 0 :(得分:2)
看看这个:
from itertools import permutations
my_list = [['cat','bat'],['sat','rat','mat'],['cat','bat','hat'],['pat','mat']]
for a,b in permutations(my_list,2):
if set(a).issubset(b):
my_list.remove(b)
print my_list
答案 1 :(得分:1)
基本上您想按标准过滤列表。将数据转换为可以轻松应用标准的类型,如set
并应用列表理解:
<强> listmatching.py 强>
def get_top_sets(mylist):
""" Returns a list of minimal subsets of the original"""
m = [set(sublist) for sublist in mylist] # Convert into list of sets
# If there is no element t that is a subset of s, add s to the new list
return [list(s) for s in m if not any(not s == t and t.issubset(s) for t in m)]
这里我们测试是否存在任何元素是当前元素的子集。如果检查失败,则没有这样的元素,并且我们有一个元素不是任何其他元素的子集,我们可以将它添加到我们的新列表中。
<强>解释强>
>>> from listmatching import get_top_sets
>>> my_list = [['cat','bat'],['sat','rat','mat'],['cat','bat','hat'],['pat','mat']]
>>> print get_top_sets(my_list)
[['bat', 'cat'], ['rat', 'mat', 'sat'], ['pat', 'mat']]
我们将其转换回列表解析中的原始list
类型。