Python字典中是否可以有多个键?

6

我希望在Python中构建一个字典,其中不同的键引用相同的元素。我有以下这个字典:

persons = {"George":'G.MacDonald', "Luke":'G.MacDonald', "Larry":'G.MacDonald'} 

关键字都指向相同的字符串,但这些字符串在程序内部有不同的内存位置。我想创建一个字典,使所有这些关键字都指向同一个元素,这是否可能?


你是说每当你创建一个字符串时,它都会使用内存中的一个吗? - jamylak
无论如何,当您构建字典时,它们都是完全相同的字符串。这是用于什么应用程序? - jamylak
foo = 'G.MacDonald'; persons = {'George': foo, 'Luke': foo, 'Larry': foo} - JosefAssad
也许可以通过实现一个多键字典来解决这个问题: https://dev59.com/_mgu5IYBdhLWcg3wRlBh#16966988 - formiaczek
请参见:https://dev59.com/iFYN5IYBdhLWcg3wXnT7 - dreftymac
2个回答

5
你可以这样做:

您可以像下面这样操作:

import itertools as it

unique_dict = {}
value_key=lambda x: x[1]
sorted_items = sorted(your_current_dict.items(), key=value_key)
for value, group in it.groupby(sorted_items, key=value_key):
    for key in group:
        unique_dict[key] = value

这将把你的字典转换为一个字典,其中任何类型(但可比较)相等的值都是唯一的。如果你的值不可比较(但是可哈希),你可以使用一个临时的dict

from collections import defaultdict
unique_dict = {}
tmp_dict = defaultdict(list)

for key, value in your_current_dict.items():
    tmp_dict[value].append(key)

for value, keys in tmp_dict.items():
    unique_dict.update(zip(keys, [value] * len(keys)))

2

如果你正在使用Python 3,sys.intern提供了一个非常优雅的解决方案:

for k in persons:
    persons[k] = sys.intern(persons[k])

在Python 2.7中,你可以通过一个额外的步骤实现大致相同的功能:
interned = { v:v for v in set(persons.itervalues()) }
for k in persons:
    persons[k] = interned[persons[k]]

在2.x版本(< 2.7),您可以使用interned = dict( (v, v) for … )来编写代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接