如何找到mylist所在的最少量列表,例如,
对于下面的列表,我可以很容易地发现Sarah的动物都使用set(sarahs_animals) < set(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']
答案 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
的第一个组合。因为我们从最小的组合开始,即。由一组组成,并提前到两组,三组等,发现的第一组保证是最小的(如果有几种相同大小的可能组合,只发现其中一组)。