在集合字典中将具有相同值的所有键分组
我正在尝试将集合的字典作为具有重复的值转换为具有唯一集合作为值的字典,同时将键连接在一起。
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))
回答
您可以将输入字典“反转”为将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)最后一个列表理解中的a 来“解冻”它们。