我想要一个类似字典的类,它在查找时透明地使用转换后的键,以便我可以编写
k in d # instead of f(k) in d
d[k] # instead of d[f(k)]
d.get(k, v) # instead of d.get(f(k), v)
Run Code Online (Sandbox Code Playgroud)
等等(例如,想象一下f进行某种规范化,例如f(k)返回k.lower()。)
似乎我可以继承dict并覆盖各个操作,但并不是有一个集中位置来进行所有键都经过的这种转换。这意味着我必须覆盖所有__contains__、__getitem__、get和可能的__missing__等。这变得太乏味且容易出错,并且不是很有吸引力,除非这种开销超过手动替换f(k)普通 上的每个调用的开销dict。
我不知道为什么你的问题被否决,这是一个合理的愿望。在 Java 中,Guava 提供了几个地图转换实用程序,它们提供了您所描述的支持地图的视图。但是他们没有提供Maps.transformKeys()方法,因为它实际上不是一个非常有用的函数。有关原因的详细信息,请参阅如何使用 guava 将 Map<String, String> 转换为 Map<Long, String>和为什么 Guava 不提供转换映射键的方法。
简而言之,在一般情况下不可能有效地提供关键转换。最好的做法可能只是创建一个应用键转换的新字典,而不是创建您所设想的复杂且可能不一致的数据结构,例如:
{ f(k): v for k, v in d.iteritems() }
Run Code Online (Sandbox Code Playgroud)