【问题标题】:Group all keys with the same value in a dictionary of sets在集合字典中对具有相同值的所有键进行分组
【发布时间】:2021-03-25 16:17:49
【问题描述】:

我正在尝试将集合字典转换为具有重复值的字典,并将唯一集合作为值的字典,同时将键连接在一起。

dic = {'a': {1, 2, 3}, 'b': {1, 2}, 'c': {1, 3, 2}, 'd': {1, 2, 3}}

应该改为

{'a-c-d': {1, 2, 3}, 'b': {1, 2}}

我的尝试如下,但我认为必须有更好的方法。

def transform_dictionary(dic: dict) -> dict:
    dic = {k: frozenset(v) for k, v in dic.items()}
    key_list = list(dic.keys())
    value_list = list(dic.values())
    dict_transformed = {}   
    for v_uinque in set(value_list):
        sub_key_list = []
        for i, v in enumerate(value_list):
            if v == v_uinque:
                sub_key_list.append(str(key_list[i]))
        dict_transformed['-'.join(sub_key_list)] = set(v_uinque)
    return dict_transformed

print(transform_dictionary(dic))

【问题讨论】:

  • 谢谢大家,我的困难是我总是得到设置是不可散列的,我知道为什么。我做了我的 sn-p 来解决它,但我认为它很难看。我还是把它贴在那里。

标签: python dictionary set


【解决方案1】:

您可以将输入字典“反转”为将frozensets 映射为一组键的字典。

import collections

dic = {'a': {1, 2, 3}, 'b': {1, 2}, 'c': {1, 3, 2}, 'd': {1, 2, 3}}

keys_per_set = collections.defaultdict(list)
for key, value in dic.items():
    keys_per_set[frozenset(value)].append(key)

然后将该字典映射反转回所需的形式:

{'-'.join(keys): value for (value, keys) in keys_per_set.items()}

输出:

{'a-c-d': frozenset({1, 2, 3}), 'b': frozenset({1, 2})}

这会将值转换为冻结集,但您可以在最后一个列表理解中使用 set(value)“解冻”它们。

【讨论】:

    【解决方案2】:
    from itertools import groupby
    dic_output = {'-'.join(v):g for g,v in groupby(sorted(dic_input,
                                         key=dic_input.get),
                                  key=lambda x: dic_input[x])}
    

    输出

    {'b': {1, 2}, 'a-c-d': {1, 2, 3}}
    

    【讨论】:

      猜你喜欢
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多