如果键和值具有相同的值,如何将它们合并和切换?

2024-04-26 11:47:14 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个包含这些键和值的字典:

{'foo': 1, 'bar': 5,'foo1' : 1,'bar1' : 1,'foo2': 5}

我不能这样拉拉链

dict(zip(my.values(),my.keys()))

因为这会发生:

{1: 'foo', 5: 'bar'}

我希望我的输出是:

{1:{'bar1','foo','foo1'},5:{'bar','foo2'}}

Tags: 字典foomybarkeyszipdict拉链
3条回答

你应该使用^{}。你知道吗

from collections import defaultdict
result = defaultdict(list)
for k, v in my.items():
    result[v].append(k)

对于一个带有函数扭曲的单行程序(可能不是可读性和性能最好的代码):

import itertools, operator

my_dict = {'foo': 1, 'bar': 5, 'foo1' : 1,'bar1' : 1, 'foo2': 5}

inverse_dict = { k:map(operator.itemgetter(0), v) for k, v in itertools.groupby(sorted(my_dict.items(), key=operator.itemgetter(1)), operator.itemgetter(1)) }

要使用集合进行聚合,只需将映射的值包装到集合构造函数中。你知道吗

inverse_dict = { k:set(map(operator.itemgetter(0), v)) for k, v in itertools.groupby(sorted(my_dict.items(), key=operator.itemgetter(1)), operator.itemgetter(1)) }

给定的键不能有多个值,因此这种数据结构中的值必须是列表。使用zip()无法轻松完成此转换;需要一个for循环:

my = {'foo': 1, 'bar': 5, 'foo1': 1, 'bar1': 1,'foo2': 5}
rev = {}

for k, v in my.items():
    rev.setdefault(v, []).append(k)

从问题中的编辑来看,您似乎希望使用一组值。这也很简单:

for k, v in my.items():
    rev.setdefault(v, set()).add(k)

您也可以像Daniel建议的那样使用defaultdict,但是在这里仅仅为了这个而导入似乎有些过分了。根据字典的大小,它可能会快一点,因为使用setdefault()我们不断地创建和丢弃空容器。你知道吗

相关问题 更多 >