传递字符串、整数和元组信息作为 python 字典的键

Passing String, integer and tuple information as key for python dictionary

我正在尝试创建一个 python 字典,我想使用一个包含字符串、数字和 list/tuple 条目的键。理想情况下,钥匙应该看起来像

("stringA", "stringB", "stringC", integer1, (integer2, integer3, integer4))

我尝试基于此documentation创建一个namedtuple,如下

from collections import namedtuple
dictKey = namedtuple('dictKey', 'stringA stringB stringC integer1 
                      (integer2 integer3 integer4)')

但它抛出一个 ValueError 提示它只能包含字母数字字符和下划线。所以

  1. 如何创建包含元组的字典键?

  2. 如何有效地使用字典键(尤其是元组呢 包含)从字典中检索信息?

这里的问题是您的 namedtuple 定义,而不是字典键结构本身,它可以正常工作,例如:

>>> d = {}
>>> d[('1', '2', 3, (4, 5))] = 'foo'
>>> d
{('1', '2', 3, (4, 5)): 'foo'}

namedtuple 读取 field_names 参数时,它认为您正在尝试创建一个名为 (integer2 的字段,但没有意识到您的意思是嵌套 tuple

要在 namedtuple 中定义该结构,您必须拥有一个本身就是 tuple:

的属性
>>> from collections import namedtuple
>>> dictKey = namedtuple("dictKey", "stringA stringB stringC integer1 tuple1")
>>> key = dictKey("foo", "bar", "baz", 1, (2, 3, 4))
>>> d[key] = 'bar'
>>> d
{dictKey(stringA='foo', stringB='bar', stringC='baz', integer1=1, tuple1=(2, 3, 4)): 'bar',
 ('1', '2', 3, (4, 5)): 'foo'}

您可以像检索任何其他键一样检索针对键存储的值,或者使用原始 namedtuple:

>>> d[key]
'bar'

或新的:

>>> d[dictKey("foo", "bar", "baz", 1, (2, 3, 4))]
'bar'