2017-05-31 55 views
0

如何查找列表的最小量MYLIST是,例如, 对于下面的列表中,我可以很容易地发现,萨拉的动物都在house_animals属于使用set(sarahs_animals) < set(house_animals)Python - 检查列表是否是另一个列表的子集,如果不是,我如何分割它?

但是约翰动物跨越需要拆分zoo_animals and house_animals。 John_animals可以分成多种方式,例如它也可能是house_animals,big_animalsbird_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

只是试图重新制定:你是否试图将你的集合('johns_animals')分成最小的可能数量的子集,这些子集都是动物类别集合之一的所有子集? –

+0

是的,对于措辞问题很抱歉。 – attemptingpython

回答

0

我相信这是一个解决方案(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。由于我们从最小的组合开始,即。包括一套,并提前到两套,三套等,第一个发现保证是最小的(如果有几个可能的组合,相同的大小,只有其中之一被发现)。

+0

谢谢,它完美的作品。 – attemptingpython

相关问题