除了字符串和整数之外的Python字典键?

2024-05-21 05:51:25 发布

您现在位置:Python中文网/ 问答频道 /正文

任何人都有一些很好的字典示例,其中包含一些有趣的键(除了规范字符串或整数),以及如何在程序中使用这些键?

我知道我们只需要一个键hashable,这意味着它必须是不可变的和可比较的(有一个__eq__()__cmp__()方法)。

一个相关的问题是:如何快速而巧妙地定义一个新的hashable


Tags: 方法字符串程序规范示例字典定义整数
3条回答

可以使用元组作为键,例如,如果要创建多列索引。下面是一个简单的例子:

>>> index = {("John", "Smith", "1972/01/01"): 123, ("Bob", "Smith", "1972/01/02"): 124}
>>> index
{('Bob', 'Smith', '1972/01/02'): 124, ('John', 'Smith', '1972/01/01'): 123}
>>> index.keys()
[('Bob', 'Smith', '1972/01/02'), ('John', 'Smith', '1972/01/01')]
>>> index['John', 'Smith', '1972/01/01']
123

有关如何使用dict作为键(可散列dict)的示例,请参见以下答案: Python hashable dicts

您遗漏了对象最重要的方法是hashable__hash__()

您自己的哈希类型的最短实现是:

class A(object):
    pass

现在可以使用A的实例作为字典键:

d = {}
a = A()
b = A()
d[a] = 7
d[b] = 8

这是因为用户定义的类在默认情况下是可散列的,并且它们的散列值是它们的id——所以它们只有在它们是同一个对象时才会比较相等。

请注意,A的实例决不是不可变的,它们仍然可以用作字典键。字典键必须是不可变的语句仅对内置类型有效。

让我们去找一些更深奥的东西。假设您想要执行一个函数列表并存储每个函数的结果。对于引发异常的每个函数,您需要记录异常,还需要记录每种异常引发的次数。函数和异常可以用作dict键,因此这很简单:

funclist = [foo, bar, baz, quux]

results    = {}
badfuncs   = {}
errorcount = {}

for f in funclist:
    try:
        results[f] = f()
    except Exception as e:
        badfuncs[f]   = e
        errorcount[type(e)] = errorcount[type(e)] + 1 if type(e) in errorcount else 1

现在您可以执行if foo in badfuncs来测试该函数是否引发了异常(或者if foo in results来查看它是否正常运行)、if ValueError in errorcount来查看是否有任何函数引发了ValueError等等。

相关问题 更多 >