Python - 检查列表是否是另一个列表的子集,如果没有,我该如何拆分它?

时间:2017-05-31 09:51:04

标签: python

如何找到mylist所在的最少量列表,例如, 对于下面的列表,我可以很容易地发现Sarah的动物都使用set(sarahs_animals) < set(house_animals)

属于 house_animals

然而,约翰斯动物需要分为 zoo_animals house_animals 。 John_animals可以通过多种方式分割,例如它也可以是 house_animals,big_animals bird_animals ,我如何才能找到可以拆分的最小数量的列表?感谢

johns_animals = ['dog', 'cat', 'rhino', 'flamingo']
sarahs_animals = ['dog', 'cat']

house_animals = ['dog', 'cat', 'mouse']
big_animals = ['elephant', 'horse', 'rhino']
bird_animals = ['robin', 'flamingo', 'budgie']
zoo_animals = ['rhino', 'flamingo', 'elephant']

1 个答案:

答案 0 :(得分:1)

我相信这是一个解决方案(Python3,但很容易适应Python2)。

from itertools import combinations

johns_animals = {'dog', 'cat', 'rhino', 'flamingo'}

animal_sets = { 'house_animals': {'dog', 'cat', 'mouse'},
                'big_animals': {'elephant', 'horse', 'rhino'},
                'bird_animals': {'robin', 'flamingo', 'budgie'},
                'zoo_animals': {'rhino', 'flamingo', 'elephant'}
}

def minimal_superset(my_set):
  for n in range(1,len(animal_sets)+1):
    for set_of_sets in combinations(animal_sets.keys(), n):
      superset_union = set.union(*(animal_sets[i] for i in set_of_sets))
      if my_set <= superset_union:
        return set_of_sets

print(minimal_superset(johns_animals))

我们浏览动物集的所有可能组合,返回“掩盖”给定集合my_set的第一个组合。因为我们从最小的组合开始,即。由一组组成,并提前到两组,三组等,发现的第一组保证是最小的(如果有几种相同大小的可能组合,只发现其中一组)。