【发布时间】:2014-07-30 10:48:33
【问题描述】:
拥有一个要映射到另一个对象的对象列表是一个常见的编程问题。这通常通过字典来完成:
l1=[1,2,3]
d={1:'_ONE', 2:'_TWO', 3:'_THREE'}
l2= [d[i] for i in l1]
在许多情况下,很自然地将字典视为将键映射到值的函数。然后,您只需 l2= map(d,l1) 而不是使用列表理解(或丑陋的 map(d.__getitem__,l1)。
当然,既然 python 非常灵活,你可以很容易地得到这个行为:
class CallableDict(dict):
def __call__(self, k):
return self[k]
但这显然在访问不是您自己创建的字典时不起作用。
默认情况下不能调用基本 Python 字典有充分的理由吗?
免责声明:这个问题的动机主要是 ruby,字典是这样工作的
【问题讨论】:
-
因为调用与索引完全不同?在 Python 中,也有一种明显的做某事的方法,添加调用支持将添加另一种做某事的方法。
-
另外,
i可能不在d中:map(d.get, l)会更好,因为它可以阻止KeyError(当然,您可能不希望这样)。 -
@MartijnPieters “一种显而易见的方法”可能是最有力的理由。我认为“索引”的概念几乎不适合字典(字典将“索引”定义为“材料的顺序排列,尤其是按字母或数字顺序”),但当然,这就是大多数编程语言的做法
-
@goncalopp:官方名称是subscription;调用与订阅根本不同,这两个动作是不同的。
-
您说得有点对,因为在许多情况下,获取项目或获取属性是由函数调用处理的,因此对于这些情况,“订阅”边界是模糊的。
标签: python dictionary functional-programming call