Pythonic式的方法是什么?
value = (mydict.has_key('index') and mydict['index']) or 1024从字典的值初始化,如果存在,否则使用默认值。
得到了一些关于LBYL和EAFP的答案,但代码过于冗长:p
我想要一些单行初始化。
PS:仅python-2.4 (运行CentOS5)
发布于 2011-05-31 07:17:16
value = mydict.get('index', 1024)(请注意,这并不完全等同于您的代码,因为只有当键index不存在时,它才会使用1024,而当与键index对应的值为falsy时,您的代码也会使用1024。从你的解释中,我推断出前者才是你真正想要的。)
发布于 2011-05-31 07:24:47
也可以使用类似setdefault()的get(),但它会在返回值之前插入键:
value = mydict.setdefault('index', 1024)发布于 2011-05-31 08:39:50
要知道get和setdefault方法很重要,它们应该在任何Python程序员的工具箱中。
另一种重要的方法是使用collections.defaultdict,因为这样你就可以在一个地方定义你的“默认值”,而不必在使用字典的地方分散在代码中,也就是说,不要重复自己。这样,如果您更改了默认设置,就不需要在代码中查找所有这些get和setdefaults。例如
>>> import collections
>>> myDict = collections.defaultdict
>>> myDict = collections.defaultdict(lambda : 1024)
>>> myDict[0] += 1
>>> print myDict[0], myDict[100]
1025 1024因为要设置函数调用,所以可以对默认值执行任何操作。为每个新密钥分配一个介于1和10之间的随机值如何?
>>> import collections
>>> import random
>>> myDict = collections.defaultdict(lambda : random.randint(1,10))
>>> print myDict[0], myDict[100]
1 5
>>> print myDict[0], myDict[100], myDict[2]
1 5 6好吧,这个例子有点做作,但我相信你能想到更好的用法。假设你有一个昂贵的类要构造--只有在键不存在的情况下才会创建实例,这与调用get和setdefault时不同,例如
>>> class ExpensiveClass(object):
>>> numObjects = 0
>>> def __init__(self):
>>> ExpensiveClass.numObjects += 1
>>>
>>> print ExpensiveClass.numObjects
0
>>> x = {}
>>> x[0] = ExpensiveClass()
>>> print ExpensiveClass.numObjects
1
>>> print x.get(0, ExpensiveClass())
<__main__.ExpensiveClass object at 0x025665B0>
>>> print ExpensiveClass.numObjects
2
>>> ExpensiveClass.numObjects = 0
>>> z = collections.defaultdict(ExpensiveClass)
>>> print ExpensiveClass.numObjects
0
>>> print z[0]
>>> <__main__.ExpensiveClass object at 0x02566510>
>>> print ExpensiveClass.numObjects
1请注意,对x.get的调用构造了一个新的ExpensiveClass实例,即使我们从未使用过该实例,因为x[0]已经存在。如果您确实在尝试计算ExpensiveClass对象的数量,或者如果它们的创建速度非常慢,这可能会导致问题。这些问题在collections.defaultdict中不会发生。
https://stackoverflow.com/questions/6181532
复制相似问题