代码之家  ›  专栏  ›  技术社区  ›  Baz

字典理解:对字典中的键进行分组

  •  2
  • Baz  · 技术社区  · 7 年前

    是否可以使用字典理解对字典中的键进行分组?

    d = {0: ("A",), 1: ("BB",), 2: ("BB",), 3: ("D",), 4: ("E",)}
    l = [(0, 1, 2, 4), (3,)]
    

    制作:

    d = {(0, 1, 2, 4): ("A","BB", "E"), (3,): ("D",)}
    

    使现代化

    tuple(set(x)) ("A","BB", "E") 而不是 ("A","BB","BB","E")

    3 回复  |  直到 7 年前
        1
  •  4
  •   DeepSpace    7 年前

    defaultdict . 还请注意,我更改了 l 有一点,我认为它不应该包含嵌套元组。

    d = {0: ("A",), 1: ("BB",), 2: ("BB",), 3: ("D",), 4: ("E",)}
    l = [(0, 1, 2, 4), (3,)]
    
    output = defaultdict(list)
    
    for key_group in l:
        output[key_group].extend(d[key] for key in key_group)
    
    print(output)
    # defaultdict(<class 'list'>, {(0, 1, 2, 4): [('A',), ('BB',), ('BB',), ('E',)], (3,): [('D',)]})
    

    output 元组列表是从 tuples

    d = {0: ("A",), 1: ("BB",), 2: ("BB",), 3: ("D",), 4: ("E",)}
    l = [(0, 1, 2, 4), (3,)]
    
    output = defaultdict(list)
    
    for key_group in l:
        output[key_group].extend(chain.from_iterable(set(d[key] for key in key_group)))
    
    print(output)
    # defaultdict(<class 'list'>, {(0, 1, 2, 4): ['A', 'E', 'BB'], (3,): ['D']})
    

    为完整起见,OP答案中使用的代码 defaultdict(set) :

    from collections import defaultdict
    from itertools import chain
    
    d = {0: ("A",), 1: ("BB",), 2: ("BB",), 3: ("D",), 4: ("E",)}
    l = [(0, 1, 2, 4), (3,)]
    
    output = defaultdict(set)
    
    for key_group in l:
        output[key_group].update(chain.from_iterable(d[key] for key in key_group))
    print(output)
    # defaultdict(<class 'set'>, {(0, 1, 2, 4): {'BB', 'A', 'E'}, (3,): {'D'}})
    
        2
  •  2
  •   TrebledJ    7 年前

    这个答案演示了一个使用简单循环和理解的解决方案。因此,它可能不如其他答案有效。

    l (与DeepSpace的回答类似)。

    d = {0: ("A",), 1: ("BB",), 2: ("BB",), 3: ("D",), 4: ("E",)}
    l = [(0, 1, 2, 4), (3,)]
    

    使用正常循环:

    w_normal = {}
    for i in l:
      temp = []
      for j in i:
        temp += [d[j]]
      w_normal[tuple(i)] = temp
    

    使用字典理解(根据要求):

    w_comp = {tuple(i): [d[j] for j in i] for i in l}
    

    {(0, 1, 2, 4): [('A',), ('BB',), ('BB',), ('E',)], (3,): [('D',)]}
    

    而不是使用 tuple(set(x)) 创造 [('A',), ('BB',), ('E',)] ,保存 [('A',), ('BB',), ('BB',), ('E',)] 将允许您建立索引 ('BB',) ('E',) 关于键元组。

    然而,如果你坚持不懈,你可以做到这一点 元组(集合(x)) 具有

    w_comp = {tuple(i): tuple({d[j] for j in i}) for i in l}
    
        3
  •  1
  •   Baz    7 年前

    d = {0: ("A",), 1: ("BB",), 2: ("BB",), 3: ("D",), 4: ("E",)}
    l = [(0, 1, 2, 4), (3,)]
    
    output = defaultdict(set)
    
    for key_group in l:
        output[key_group].update(d[key] for key in key_group)