首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从可能丢失的dict值初始化Python变量

从可能丢失的dict值初始化Python变量
EN

Stack Overflow用户
提问于 2011-05-31 07:16:26
回答 4查看 1.8K关注 0票数 1

Pythonic式的方法是什么?

代码语言:javascript
复制
value = (mydict.has_key('index') and mydict['index']) or 1024

从字典的值初始化,如果存在,否则使用默认值。

得到了一些关于LBYL和EAFP的答案,但代码过于冗长:p

我想要一些单行初始化。

PS:仅python-2.4 (运行CentOS5)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-31 07:17:16

代码语言:javascript
复制
value = mydict.get('index', 1024)

(请注意,这并不完全等同于您的代码,因为只有当键index不存在时,它才会使用1024,而当与键index对应的值为falsy时,您的代码也会使用1024。从你的解释中,我推断出前者才是你真正想要的。)

票数 11
EN

Stack Overflow用户

发布于 2011-05-31 07:24:47

也可以使用类似setdefault()get(),但它会在返回值之前插入键:

代码语言:javascript
复制
value = mydict.setdefault('index', 1024)
票数 2
EN

Stack Overflow用户

发布于 2011-05-31 08:39:50

要知道getsetdefault方法很重要,它们应该在任何Python程序员的工具箱中。

另一种重要的方法是使用collections.defaultdict,因为这样你就可以在一个地方定义你的“默认值”,而不必在使用字典的地方分散在代码中,也就是说,不要重复自己。这样,如果您更改了默认设置,就不需要在代码中查找所有这些get和setdefaults。例如

代码语言:javascript
复制
>>> import collections
>>> myDict = collections.defaultdict
>>> myDict = collections.defaultdict(lambda : 1024)
>>> myDict[0] += 1
>>> print myDict[0], myDict[100]
1025 1024

因为要设置函数调用,所以可以对默认值执行任何操作。为每个新密钥分配一个介于1和10之间的随机值如何?

代码语言:javascript
复制
>>> 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

好吧,这个例子有点做作,但我相信你能想到更好的用法。假设你有一个昂贵的类要构造--只有在键不存在的情况下才会创建实例,这与调用getsetdefault时不同,例如

代码语言:javascript
复制
>>> 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中不会发生。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6181532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档