除了常见的字符串或整数外,有没有一些有趣的键的字典示例以及您如何在程序中使用它们?
我知道键所需要的仅是可哈希性(hashable
),这意味着它必须是不可变的并且可比较(具有__eq__()
或__cmp__()
方法)。
相关问题是:如何快速流畅地定义一个新的hashable
?
除了常见的字符串或整数外,有没有一些有趣的键的字典示例以及您如何在程序中使用它们?
我知道键所需要的仅是可哈希性(hashable
),这意味着它必须是不可变的并且可比较(具有__eq__()
或__cmp__()
方法)。
相关问题是:如何快速流畅地定义一个新的hashable
?
让我们来尝试一些更加神秘的事情。假设您想要执行一个函数列表并存储每个函数的结果。对于抛出异常的每个函数,您都想记录异常,并计算每种异常被引发的次数。函数和异常都可以用作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
,等等。
type(e)
而不是 t
,因为这个字典应该计算每种异常类型被引发的次数。我最初在里面有一行代码说 t = type(e)
,所以才出现了 t
。无论如何,已经修复好了。 :-) - kindall你可以使用元组作为键,例如如果你希望创建一个多列索引。这里是一个简单的例子:
>>> 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
要使用字典作为键(可哈希的字典)的示例,请参见此答案: Python hashable dicts
index['John', 'Smith', '1972/01/01']
)。 - Gabi Purcaru您遗漏了对象成为 可哈希 最重要的方法: __hash__()
。
实现自己的可哈希类型的最短代码如下:
class A(object):
pass
现在你可以使用 A
的实例作为字典的键:
d = {}
a = A()
b = A()
d[a] = 7
d[b] = 8
这是因为用户自定义类默认情况下可哈希,并且它们的哈希值是它们的id -- 所以只有当它们是同一对象时才会相等。
请注意,A
的实例绝不是不可变的,并且尽管如此,它们仍然可以用作字典键。字典键必须是不可变的这种说法仅适用于内置类型。
object.__hash__
会表现出这样的行为(因为使用它的对象作为字典键时无法按预期工作)。但是请参阅http://wiki.python.org/moin/DictionaryKeys,了解为什么这是一个巨大的头痛。 - user395760>>> Terrain = { (1,3):"Forest", (1,5):"Water", (3,4):"Land" }
>>> print Terrain
{(1, 5): 'Water', (1, 3): 'Forest', (3, 4): 'Land'}
>>> print Terrain[(1,3)]
Forest
>>> print Terrain[(1,5)]
Water
>>> x = 3
>>> y = 4
>>> print Terrain[(x,y)]
Land
我不知道为什么你想这样做(最好不要这样做)……但是除了字符串和整数,你也可以同时使用它们。作为一个初学者,我发现以下内容既强大又令人惊讶:
foo = { 1:'this', 2:'that', 'more':'other', 'less':'etc' }
这是一个完全有效的字典,可以轻松访问foo[2]
和foo['more']
。
__hash__
方法并获得一个整数。没有更多的内容。如果字典/集合等是二叉树,就需要比较函数。 - user395760