【问题标题】:how to convert dict_values into a set如何将 dict_values 转换为集合
【发布时间】:2018-01-26 22:45:43
【问题描述】:

我有一个 dict,其中包含作为每个键的值的集合,例如

{'key1': {8772, 9605},'key2': {10867, 10911, 10917},'key3': {11749,11750},'key4': {14721, 19755, 21281}}

现在我想将每个值,即ints 的集合放入set,我想知道这样做的最佳方式/最有效的方式是什么。

{8772,9605,10867,10911,10917,11749,11750,14721,19755,21281}

我尝试使用dict.values()dict 中检索值,但它返回一个dict_values 对象,使其成为一个列表,list(dict.values()) 给了我一个集合列表,set(list(exact_dups.values())) 给了我错误,

TypeError: unhashable type: 'set'

更新。忘了说结果集也需要保持唯一性,即没有重复。

【问题讨论】:

  • 您想要one 中的所有 值设置还是要为每个值设置一组?
  • @AdiC 是的,这就是我想要实现的目标

标签: python-3.x list set


【解决方案1】:

您可以使用 set.union() 和未打包的值:

set.union(*my_dict.values())

或者您可以将set.union()reduce 结合使用:

reduce(set.union, my_dict.values())

【讨论】:

  • @deceze 如果所有对象碰巧都是sets,但在它们可能不是的情况下,通常最好(除非你真的需要强制它们是集合)初始化一个空的设置它可以在任意可迭代对象上工作 - 例如,set.union([1,2,3], [2, 3, 4]) 将失败...
  • @Jon 如果这是一个问题,那么是的。
【解决方案2】:

使用reduceset union 的组合:

from functools import reduce

result = reduce(lambda a, b: a.union(b), my_dict.values(), set())
print(result)

【讨论】:

    【解决方案3】:

    使用集合联合运算符(|,“或”)进行序列约简:

    from functools import reduce
    from operator import or_
    
    d = {'key1': {8772, 9605},'key2': {10867, 10911, 10917},'key3': {11749,11750},'key4': {14721, 19755, 21281}}
    s = reduce(or_, d.values())
    

    它本质上是d['key1'] | d['key2'] | ...

    【讨论】:

    • 或:set().union(*d.values())... 然后让set 内置函数在它认为合适的时候处理它,而不是一次不断地构建和减少到一个集合。
    • 功能不足以满足我的口味。 ;-)(说真的,是的,这可能更好。)
    • @deceze 想知道我是否还想保持最终结果集的唯一性,我该怎么办?
    • @daiyue 不知道这是什么意思。
    • @daiyue Yeees,这就是它的作用,因为它正在创建集合的并集,从而产生一个集合。
    【解决方案4】:

    非常简单可读不言自明解决方案,无需任何导入:

    arr = []
    for key in dictionary:
        arr += list(dictionary[key])
    
    answer = set(arr.sorted())
    

    【讨论】:

    • answer = set(sorted(arr))
    【解决方案5】:

    更简单的方法

    set1 = set()
    for i in dict.values():
        set1.update(i)
    set1
    

    【讨论】:

      【解决方案6】:

      你可以试试这个方法:

      keys_set= set()
      for item in dict.values():
          keys_set.add(item)
      

      【讨论】:

        【解决方案7】:

        我们只能访问 OP 想要的值,然后按如下方式对其进行排序:

        dict1 = {'key1': {8772, 9605},'key2': {10867, 10911, 10917},'key3': {11749,11750},'key4': {14721, 19755, 21281}}
        
        arr = []
        for key in sorted(dict1.values()):
            arr += key
        
        
        print('{', ','.join(str(n) for n in arr), '}', sep='')
        

        生产,

        {8772,9605,10867,10917,10911,11749,11750,14721,19755,21281}
        
        [Program finished]
        

        按照 OP 的要求。

        【讨论】:

          猜你喜欢
          • 2017-12-24
          • 2013-12-01
          • 2010-10-09
          • 2013-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多