键错误在Dictionary中使用多个键到相同的值

时间:2017-11-12 20:57:32

标签: python python-3.x dictionary

我试图创建一个字典,为不同的密钥返回相同的值,目前我喜欢它:

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']时,我收到一个关键错误,可能是什么问题?

2 个答案:

答案 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个元素的元组,因此在字典理解中对键元组的迭代工作,而不是添加逗号将使其看起来有效,但它将创建键S1S2的个别字母......:不是您想要的内容)

答案 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'