2017-05-31 76 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

相關問題