【问题标题】:Merging sets within sets in Python在 Python 中的集合内合并集合
【发布时间】:2014-11-25 07:30:35
【问题描述】:

我有一个这样的集合(任何收藏类型都可以)。

myset = {{a},{b},{c},{d,e}, {d,f}}

我现在正在尝试检查 myset 中是否存在两个元素 {a} 和 {d},如果存在,则将 {a} 与 {d,e} 合并。另一方面,如果我检查 {d} 和 {f},那么我将合并 {d,e} 和 {d,f} 以得到 {d,e,f}。

如果有人告诉我解决方案的方向,我将不胜感激。

【问题讨论】:

  • 您能更详细地解释一下您的逻辑吗?如果 {a} 和 {d} 退出,选择 {a} 添加到集合中的逻辑是什么?
  • 你的问题不清楚。
  • 在这种情况下会发生什么:{{a,b},{a,c},{b,d},{b,e}} 并且您正在检查 {a} 和 {b}
  • 我永远不会有像 {{a,b},{a,c},{b,d},{b,e}} 这样的集合。我正在从一组以 {{a},{b},{c},{d}} 开头的集合构建我的集群。在第一次迭代中,我可以将 {a} 和 {b} 与结果输出 {{ab},{c},{d}} 合并。在第二种情况下,我可能会搜索 {a} 和 {c},结果是 {{abc},{d}}
  • 我遇到的问题基本上是,给定一个集合(myset)和两个搜索元素i和j,newmyset = myset - i - j U (i,j)

标签: python list merge set


【解决方案1】:

这可能不是最 Pythonic 的方法,但应该可以,如果不行,请告诉我 我已经为列表做了,你可以使用类似的方法为集合做它

def get_member(a,the_list):
    if a in the_list:
        return a
    else:
        for elem in the_list:
            if isinstance(elem,list):
                if a in elem:
                    return elem
    return None

def merge_member(a,b,the_list):
    get_member_a = get_member(a,the_list)
    get_member_b = get_member(b,the_list)
    if get_member_a and get_member_b:
        the_list.remove(get_member_a)
        the_list.remove(get_member_b)
        if isinstance(get_member_b,list):
            get_member_b.extend(get_member_a)
            the_list.append(get_member_b)
        elif isinstance(get_member_a,list):
            get_member_a.extend(get_member_b)
            the_list.append(get_member_a)
        else:
            the_list.append([get_member_b,get_member_a])
    return the_list

【讨论】:

  • 非常感谢。我会对其进行测试并回复您。
  • 这对我来说很好用。但是,将其更改为集合是一个问题,因为 python 集合不接受 [unhashable] 集合或列表作为元素。无论如何,我至少有一个解决手头问题的方法。
  • 是的,你必须使用frozensets,虽然我想你已经知道了。
【解决方案2】:

首先:您不能在 python 中构建一组集合,因为 set 需要包含可散列值,而 set 本身 is not hashable

当然,你也可以对一组集合做同样的事情。可能最快和最 Pythonic 的解决方案应该是这样的:

myset = [{1}, {2}, {3}, {4, 5}, {5, 6}]
merged_set = set().union(*myset)

(set.union 不能只与一个参数一起使用,but with any number of parameters

【讨论】:

    【解决方案3】:

    我似乎需要改进 merge_member 块来处理我们有 [['a'],['b'],['c'],['d'],['e', 'f','g']],作为 the_list,我们正在寻找 'e' 和 'f'。

    def merge_member(a,b,the_list):
        get_member_a = get_member(a, the_list)
        get_member_b = get_member(b, the_list)
        if get_member_a and get_member_b:
            if get_member_a.__eq__(get_member_b):
               the_list.remove(get_member_a)
               if isinstance(get_member_b, list):
                  the_list.append(get_member_b)
            else:
               the_list.remove(get_member_a)
               the_list.remove(get_member_b)
               if isinstance(get_member_b, list):
                  get_member_b.extend(get_member_a)
                  the_list.append(get_member_b)
               elif isinstance(get_member_a, list):
                  get_member_a.extend(get_member_b)
                  the_list.append(get_member_a)
               else:
                  the_list.append([get_member_b,get_member_a])
        return the_list
    

    【讨论】:

      【解决方案4】:

      您可以使用此方法合并一个集合列表:

      from functools import reduce # for python3
      myset = [{'a'}, {'b'}, {'c'}, {'d','e'}, {'d','f'}] 
      reduce(lambda x, y: {*x, *y}, myset)
      

      输出:

      {'a', 'b', 'c', 'd', 'e', 'f'}
      

      问题的解决方案:

      from functools import reduce # for python3
      myset = [{'a'}, {'b'}, {'c'}, {'d','e'}, {'d','f'}]  # define your set list
      
      def get_element_set(elem, myset):
          try:
              z = [x for x in myset if elem in x] 
              result = reduce(lambda x, y: {*x, *y}, z)
              return result
          except TypeError as e:
              print('Element "%s" is not exist in myset!' % elem)
              return {}
      
      def merge_member(elem_list, myset):
          z = map(lambda elem: get_element_set(elem, myset), elem_list)
          result = reduce(lambda x, y: {*x, *y}, z)
          return result
      

      例子:

      get_element_set('d', myset) # {'d', 'e', 'f'}
      get_element_set('g', myset) # Element "g" is not exist in myset! {}
      merge_member(['f', 'd'], myset) # {'d', 'e', 'f'}
      merge_member(['a', 'd'], myset) # {'a', 'd', 'e', 'f'}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 2015-08-26
        • 1970-01-01
        • 2015-08-27
        相关资源
        最近更新 更多