每个值有多个键

d.p*_*tto 35 python python-2.7 python-3.x

是否可以在Python字典中为每个值分配多个键.一种可能的解决方案是为每个键分配值:

dict = {'k1':'v1', 'k2':'v1', 'k3':'v1', 'k4':'v2'}
Run Code Online (Sandbox Code Playgroud)

但这不是内存效率,因为我的数据文件大于2 GB.否则你可以制作字典键的字典:

key_dic = {'k1':'k1', 'k2':'k1', 'k3':'k1', 'k4':'k4'}
dict = {'k1':'v1', 'k4':'v2'}
main_key = key_dict['k2']
value = dict[main_key]
Run Code Online (Sandbox Code Playgroud)

这也是非常耗费时间和精力的,因为我必须经历两次整个字典/文件.还有其他简单和内置的Python解决方案吗?

注意:我的字典值不是简单的字符串(如问题'v1','v2')而是相当复杂的对象(包含不同的其他字典/列表等等,并且不可能腌制它们)

注意:问题看起来类似如何我同时使用键和索引作为相同的字典值? 但我不是在寻找有序/索引字典,我正在寻找其他有效的解决方案(如果有的话),除了这个问题中提到的两个.

Use*_*ess 37

这些价值观是什么类型的?

dict = {'k1':MyClass(1), 'k2':MyClass(1)}
Run Code Online (Sandbox Code Playgroud)

会给出重复的值对象,但是

v1 = MyClass(1)
dict = {'k1':v1, 'k2':v1}
Run Code Online (Sandbox Code Playgroud)

导致两个键引用相同的实际对象.

在原始问题中,你的值是字符串:即使你两次声明相同的字符串,我认为在这种情况下它们将被插入同一个对象


NB.如果你不确定你是否最终得到重复,你可以这样发现:

if dict['k1'] is dict['k2']:
    print("good: k1 and k2 refer to the same instance")
else:
    print("bad: k1 and k2 refer to different instances")
Run Code Online (Sandbox Code Playgroud)

(is感谢JFSebastian,替换id())

  • 您可以使用`obj1 is obj2`来测试对象标识,而不是`id(obj1)== id(obj2)` (4认同)

for*_*zek 10

看看这个 - 它正是你所要求的实现:multi_key_dict(ionary)

https://pypi.python.org/pypi/multi_key_dict (来源:https://github.com/formiaczek/python_data_structures/tree/master/multi_key_dict)

(在Unix平台上,它可能作为一个包,你可以尝试安装它,如:

sudo apt-get install python-multi-key-dict
Run Code Online (Sandbox Code Playgroud)

用于Debian,或等同于您的发行版)

您可以为键使用不同类型,也可以使用相同类型的键.您还可以使用您选择的键类型迭代项目,例如:

m = multi_key_dict()
m['aa', 12] = 12
m['bb', 1] = 'cc and 1'
m['cc', 13] = 'something else'

print m['aa']   # will print '12'
print m[12]     # will also print '12'

# but also:
for key, value in m.iteritems(int):
    print key, ':', value
# will print:1
# 1 : cc and 1
# 12 : 12
# 13 : something else

# and iterating by string keys:
for key, value in m.iteritems(str):
    print key, ':', value
# will print:
# aa : 12
# cc : something else
# bb : cc and 1

m[12] = 20 # now update the value
print m[12]   # will print '20' (updated value)
print m['aa']   # will also print '20' (it maps to the same element)
Run Code Online (Sandbox Code Playgroud)

键的数量没有限制,因此代码如下:

m['a', 3, 5, 'bb', 33] = 'something' 
Run Code Online (Sandbox Code Playgroud)

是有效的,并且任一键都可用于引用如此创建的值(读/写或删除它).

编辑:从版本2.0开始,它也应该与python3一起使用.