2017-05-30 44 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