查找具有重复值的字典键

lzc*_*lzc 15 python dictionary

__CODE__

我想把我们的词典的关键字归还给他们的价值,这些关键词存在了不止一次.

有人可以告诉我如何实现这个吗?

some_dict = {"firstname": "Albert", "nickname": "Albert", "surname": "Likins", "username": "Angel"}
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 22

首先,将字典翻转成反向多字节,将每个值映射到它映射到的所有键.像这样:

>>> some_dict = {"firstname":"Albert","nickname":"Albert","surname":"Likins","username":"Angel"}
>>> rev_multidict = {}
>>> for key, value in some_dict.items():
...     rev_multidict.setdefault(value, set()).add(key)
Run Code Online (Sandbox Code Playgroud)

现在,您只是在寻找具有多于1个值的multidict中的键.这很简单:

>>> [key for key, values in rev_multidict.items() if len(values) > 1]
['Albert']
Run Code Online (Sandbox Code Playgroud)

除了multidict键之外,还有原始的dict值.因此,这是每个重复的值,而不是与每个重复值匹配的所有键.但是你知道匹配每个重复值的所有键什么?

>>> [values for key, values in rev_multidict.items() if len(values) > 1]
[{'firstname', 'nickname'}]
Run Code Online (Sandbox Code Playgroud)

当然,这会给你一个集合列表.如果您想将其展平为单个列表或集合,那很容易.您可以使用chain.from_iterable,或嵌套理解,或任何其他常用技巧.例如:

>>> set(chain.from_iterable(values for key, values in rev_multidict.items() if len(values) > 1))
{'firstname', 'nickname'}
Run Code Online (Sandbox Code Playgroud)

  • 是的,我明白了。我表达的很糟糕。时间/记忆不是*真正*直接的问题,更多的是让我觉得套装更“强大”,而对我来说,他们的力量在这里浪费了。我想我主要使用它们来统一东西或构建交叉点或进行快速“in”检查等,因此使用它们而不使用任何这些功能似乎很奇怪。另外我不喜欢写`set()` :-)。但就像我说的,我确实明白你的意思,我可以看到即使你不使用潜在的力量,*拥有*一个`set`中的一个集合是很自然的。对于这样的情况,我可能会切换到设置。谢谢。 (2认同)

Ble*_*der 15

我会从翻转键和值开始:

flipped = {}

for key, value in d.items():
    if value not in flipped:
        flipped[value] = [key]
    else:
        flipped[value].append(key)
Run Code Online (Sandbox Code Playgroud)

你可以更有效地做到这一点collections.defaultdict(set).对于您的字典,flipped将看起来像:

{
    'Albert': ['nickname', 'firstname'],
    'Angel':  ['username'],
    'Likins': ['surname']
}
Run Code Online (Sandbox Code Playgroud)


Igo*_*bia 5

此方法既不需要外部库也不需要if语句:

    reverse_dic = {}
    for k, v in original_dic.iteritems():
        reverse_dic[v] = reverse_dic.get(v, [])
        reverse_dic[v].append(k)
Run Code Online (Sandbox Code Playgroud)