2017-05-30 55 views
3

可以說我有這些數字集找到數字子集的分組

a = {1, 2, 3} 
b = {2, 3, 4} 
c = {1, 5} 

我想找到集所有不同的數字分組。其結果將是

{1}, {2, 3}, {4}, {5} 

我幼稚的做法,這是不行的,是這樣的:

data = [{1, 2, 3}, {2, 3, 4}, {1, 5}] 
for i in range(1, 5): 
    s = set.intersection(*[x for x in data if i in x]) 
    print(s) 

它返回

set([1]) 
set([2, 3]) 
set([2, 3]) 
set([2, 3, 4]) 

這可以很容易地去重複,但沒有給出預期的結果。

我怎樣才能得到存在於子集中的數字的分組?

+0

不確定你的算法是否有效。你可能想要通過[0,1,2]的2^3-1子集,看看哪些是每個子集中出現的元素,而不是互補的 – WNG

+4

你能澄清一下存在於子集中的數字的分組嗎?進一步設置?你有什麼想法「獨特的數字分組」?因爲「{1}」,「{4}」和「{5}」當然不是任何類型的組。 – zwer

回答

5

你的代碼有兩個問題:

  • 你停在5,但range不包括停止讓你不檢查5.
  • 如果值僅在一組,你需要創建一個只包含該值的集合。至少你的預期結果看起來好像這是所需的行爲。

所以通過解決這些問題的代碼是這樣的:

data = [{1, 2, 3}, {2, 3, 4}, {1, 5}] 
for i in range(1, 6): 
    useful_sets = [x for x in data if i in x] 
    if len(useful_sets) <= 1: 
     print(set([i])) 
    else: 
     s = set.intersection(*useful_sets) 
     print(s) 

# prints: 
# {1} 
# {2, 3} 
# {2, 3} 
# {4} 
# {5} 

得到一個完整的(而不是複製)的結果,你可以將它們存儲在一組frozensets:

data = [{1, 2, 3}, {2, 3, 4}, {1, 5}] 
res = set() 
for i in range(1, 6): 
    useful_sets = [x for x in data if i in x] 
    if len(useful_sets) <= 1: 
     res.add(frozenset([i])) 
    else: 
     s = set.intersection(*useful_sets) 
     res.add(frozenset(s)) 

print(res) 
# {frozenset({5}), frozenset({4}), frozenset({2, 3}), frozenset({1})} 

哪個(除了排序)應該正是你想要的。

+1

而不是一個固定的'範圍',你可以「解壓縮」所有數據並迭代它們'set.union(* data)' – pylang