python匹配列表

时间:2015-10-31 08:19:53

标签: python

将子列表与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)]

2 个答案:

答案 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类型。