Pet*_*ete 30 python dictionary
任何人都有一些简洁的字典示例,其中包含一些有趣的键(除了规范字符串或整数),以及您在程序中如何使用它们?
我理解一个关键所需要的东西hashable,意味着它必须是不可变的和可比较的(有一个__eq__()或一个__cmp__()方法).
一个相关的问题是:我怎样才能快速,轻松地定义一个新的hashable?
kin*_*all 33
让我们去寻找一些更深奥的东西.假设您想要执行一系列函数并存储每个函数的结果.对于引发异常的每个函数,您希望记录异常,并且还要计算引发每种异常的次数.函数和异常可用作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
Run Code Online (Sandbox Code Playgroud)
现在,您可以if foo in badfuncs测试该函数是否引发异常(或if foo in results查看它是否正常运行),if ValueError in errorcount以查看是否有任何函数引发ValueError,等等.
pat*_*net 11
您可以使用元组作为键,例如,如果要创建多列索引.这是一个简单的例子:
>>> 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
Run Code Online (Sandbox Code Playgroud)
有关如何使用dict作为键(可以使用dict)的示例,请参阅以下答案: Python hashable dicts
你忽略了一个对象是可能是最重要的方法哈希的:__hash__().
您自己的哈希类型的最短实现是这样的:
class A(object):
pass
Run Code Online (Sandbox Code Playgroud)
现在您可以使用A字典键的实例:
d = {}
a = A()
b = A()
d[a] = 7
d[b] = 8
Run Code Online (Sandbox Code Playgroud)
这是因为默认情况下用户定义的类是可清除的,并且它们的哈希值是它们的id - 所以如果它们是同一个对象,它们只会相等.
请注意,实例A绝不是不可变的,并且它们可以用作字典键.字典键必须是不可变的语句仅适用于内置类型.
请注意,我从未真正使用过它,但我一直认为使用元组作为键可以让您做一些有趣的事情。例如,我会发现这是一种映射网格坐标的便捷方法。你可以把它想象成一个电子游戏中的网格(可能是某种战术游戏,比如Fire Emblem):
>>> 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
Run Code Online (Sandbox Code Playgroud)
类似的东西。
编辑:正如 Mark Rushakof 在评论中指出的那样,我基本上打算将其作为一个sparse array。