对字典中的键使用不可变的数据类型

时间:2019-05-25 19:08:00

标签: python dictionary tuples

你好,我似乎无法使我的代码返回任何值。

我的原始代码是:

 room_numbers = {
    ['Freddie', 'Jen']: 403,
    ['Ned', 'Keith']: 391,
    ['Kristin', 'Jazzmyne']: 411,
    ['Eugene', 'Zach']: 395
    }

我的新代码在下面列出

room_numbers = {
tuple (['Freddie', 'Jen']): (403),
tuple (['Ned', 'Keith']): 391,
tuple (['Kristin', 'Jazzmyne']): 411,
tuple (['Eugene', 'Zach']): 395
}

我更改了它,以便可以使用正确的数据类型。我知道您不能为字典使用可变数据类型,而Python要求我们为字典中的键使用不可变数据类型。但是,我不知道如何调用字典。但是,当我尝试调用不同的数据类型时,我无法打印出任何结果。

如果我对以上代码所做的更改正确无误,为什么我不能执行以下操作,请您回答:

print (room_numbers['Freddie'])  #why does this not return 403?

我想调用唯一键以返回分配给它们的唯一值。 python的处理代码是什么?

3 个答案:

答案 0 :(得分:1)

room_numbers['Freddie']不会返回任何内容,实际上应该引起错误,因为字典Freddie中没有键room_numbers。但是,您可以访问('Freddie', 'Jen')键,因为该键存在。

room_numbers[('Freddie', 'Jen')]  # or room_numbers['Freddie', 'Jen']

但这可能不是您想要的。你可能在追赶

room_numbers = {
    'Freddie': 403,
    'Jen': 403,
    'Ned': 391,
    'Keith': 391,
    ...
}

由于此特定词典中有一个room_numbers['Freddie']键,因此您可以执行Freddie

答案 1 :(得分:0)

如果您有此字典,其中包含tuple个项作为键:

room_numbers = {
     ('Freddie', 'Jen'): 403,
     ('Ned', 'Keith'): 391,
     ('Kristin', 'Jazzmyne'): 411,
     ('Eugene', 'Zach'): 395
     }

您想通过为每个名称为一个相同元组的所有名称创建一个具有相同值的键来转换此字典。通过字典理解来实现:

flat_dict = {k:v for kt,v in room_numbers.items() for k in kt}

结果:

>>> flat_dict
{'Freddie': 403, 'Jen': 403, 'Ned': 391, 'Keith': 391, 'Kristin': 411, 'Jazzmyne': 411, 'Eugene': 395, 'Zach': 395}

现在访问名称会为您提供值。

答案 2 :(得分:-1)

以下数据结构将完成这项工作:

room_numbers = {
    'Freddie': 403, 'Jen': 403,
    'Ned': 391, 'Keith': 391,
    'Kristin': 411, 'Jazzmyne': 411,
    'Eugene':395, 'Zach': 395
    }

要回答您的问题:字典数据结构需要一个“键”并将其映射到“值”。它旨在完全做到这一点。

是的,您的表示法更紧凑,如果我们不必重复房间号,这会很酷吗?我同意,但是,我们需要另一个数据结构。例如,我们可以将房间号映射到那里的人:

room_numers = {
    403: ['Freddie', 'Jen'],
    ...
}

这是一种更为紧凑的表示形式,但是,与直接映射相比,查找房间号需要进行更多的计算(因为我们需要搜索所有列表)。