在python中更聪明地“反向”字典(对于某些值是相同的,acc)?

2024-06-28 15:25:10 发布

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

def revert_dict(d):
    rd = {}
    for key in d:
        val = d[key]
        if val in rd:
            rd[val].append(key)
        else:
            rd[val] = [key]
    return rd

>>> revert_dict({'srvc3': '1', 'srvc2': '1', 'srvc1': '2'}) 
{'1': ['srvc3', 'srvc2'], '2': ['srvc1']}

这显然不是简单的键与值的交换:这会覆盖一些值(作为新的键),这不是我要的。在

如果两个或更多的值对于不同的键是相同的,那么键应该被分组在一个列表中。在

上面的功能可以用,但是我想知道有没有更智能/更快的方法?在


Tags: keyinforreturnifdefvalrd
3条回答

看起来不错。您可以使用^{}将其简化一点:

import collections

def revert_dict(d):
    rd = collections.defaultdict(list)

    for key, value in d.iteritems():
        rd[value].append(key)

    return rd

可能效率不高,但是:

ks, vs = old_dict.items()
new_dict = dict((v, [k for k in ks if old_dict[k] == v]) for v in set(vs))

另一种方法。不确定这是否更快(我对此表示怀疑)。在

from itertools import groupby

old_dict = {'srvc3': '1', 'srvc2': '1', 'srvc1': '2'}
funcval = d.__getitem__
new_dict = dict((val, list(keys)) for val, keys in \
                groupby(sorted(d.iterkeys(), key=funcval), funcval))

# new_dict:
# {'1': ['srvc3', 'srvc2'], '2': ['srvc1']}

您的初始代码肯定不错(可读),尽管我可能会这样写(实际上主要是个人偏好):

^{pr2}$

相关问题 更多 >