我试图创建一个字典,为不同的密钥返回相同的值,目前我喜欢它:
GScale = {
('S1') : 'gN',
('S2') : 'aN',
('S3') : 'bN',
('N1','G1','A2','B2') : 'gG',
('N2','G2','A1','B3','C2') : 'aA',
('N3','G3','A3','B1','C3','D2') : 'bB',
('N4','A4','B4','C1','D3','E2') : 'cC',
('N5','B5','C4','D1','E3','F2') : 'dD',
('N6','C5','D4','E1','F3') : 'eE',
('N7','D5','E4','F1') : 'fF'
}
当我要求GScale['S1']
时,我成功地获得了' gn'但当我要求GScale['N1']
时,我收到一个关键错误,可能是什么问题?
答案 0 :(得分:2)
你的词典有两种类型的键:
("S1")
这样的字符串(括号不在这里制作元组,可能是你混淆的原因)("N1",...)
因此仅使用N1
查询字典不起作用,因为N1
不是键,它是某个键元组的部分。
如果你想这样写它是为了方便,我建议你以后在字典理解中重做它:
GScale = {
('S1',) : 'gN', # trailing comma is needed now
('S2',) : 'aN',
('S3',) : 'bN',
('N1','G1','A2','B2') : 'gG',
('N2','G2','A1','B3','C2') : 'aA',
('N3','G3','A3','B1','C3','D2') : 'bB',
('N4','A4','B4','C1','D3','E2') : 'cC',
('N5','B5','C4','D1','E3','F2') : 'dD',
('N6','C5','D4','E1','F3') : 'eE',
('N7','D5','E4','F1') : 'fF'
}
GScale = {k:v for kl,v in GScale.items() for k in kl}
现在GScale
是:
{'N1':'gG','B5':'dD','D4':'eE','C3':'bB','A3':'bB','S3':'bN ','F3':'eE','C4':'dD','E3':'dD','D1':'dD','A4':'cC','E2':'cC', 'G2':'aA','C5':'eE','A2':'gG','N2':'aA','E4':'fF','E1':'eE','D5 ':'fF','N6':'eE','N7':'fF','B1':'bB','A1':'aA','C1':'cC','F2': 'dD','B3':'aA','G3':'bB','F1':'fF','D3':'cC','B2':'gG','B4':'cC ','G1':'gG','S1':'gN','C2':'aA','N5':'dD','S2':'aN','N3':'bB', 'D2':'bB','N4':'cC'}
现在扩展键/值对并查询任何N1
或字母+数字。
(请注意,单值键添加了逗号以使它们成为1个元素的元组,因此在字典理解中对键元组的迭代工作,而不是添加逗号将使其看起来有效,但它将创建键S1
,S2
的个别字母......:不是您想要的内容)
答案 1 :(得分:1)
正如评论中所解释的那样,您的代码没有机会工作 - 就像词典中一样,总是有单个键,而不是多个键。在您的示例中,单个键是值的元组,但它们仍构成每对中的单个键。
您所追求的目标似乎是https://pypi.python.org/pypi/multi_key_dict
中multi_key_dict
的目标
我还没试过,但是如果你使用了这个库,你可以选择:
from multi_key_dict import multi_key_dict
gscale = multi_key_dict()
# ... other
gscale['N1','G1','A2','B2'] = 'gG'
gscale['N2','G2','A1','B3','C2'] ='aA'
# ... other
# then...
print(gscale['N1']) # yields 'gG'