Ada*_*kin 25 python dictionary coding-style
假设我有一个字典,我想检查一个键是否映射到非空值.执行此操作的一种方法是len函数:
mydict = {"key" : "value", "emptykey" : ""}
print "True" if len(mydict["key"]) > 0 else "False" # prints true
print "True" if len(mydict["emptykey"]) > 0 else "False" # prints false
Run Code Online (Sandbox Code Playgroud)
但是,可以依赖Python的语义,以及如果定义了一个对象,它的计算结果为true,并省略了len调用:
mydict = {"key" : "value", "emptykey" : ""}
print "True" if mydict["key"] else "False" # prints true
print "True" if mydict["emptykey"] else "False" # prints false
Run Code Online (Sandbox Code Playgroud)
但是,我不确定哪个更像Pythonic.第一种感觉"显性比隐性更好",然而第二种感觉"简单比复杂更好".
我也想知道,如果我正在使用的dict不一定包含字符串,但是可以包含其他可以使用的类型(列表,集合等),那么抛弃len调用是否会让我感到困惑.OTOH,在前者(使用len调用)如果None被存储为值,代码将被炸毁,而非len版本将按预期工作(将eval为false).
哪个版本更安全,更Pythonic?
编辑:澄清假设:我知道密钥在字典中,我知道值是可以使用的.我也无法避免让零长度值进入字典.
编辑#2:似乎人们忽略了我的问题.我不是要确定检查字典中是否存在键的最Pythonic /最安全的方法,我正在尝试检查值是否为零长度
Eth*_*man 29
如果您知道密钥在字典中,请使用
if mydict["key"]:
...
Run Code Online (Sandbox Code Playgroud)
它简单易读,并且说,"如果与'key'相关联的值评估True,做某事".要知道的重要信息是容器类型(dict,list,tuple,str等)仅评估True它们len是否大于0.
KeyError如果mydict违反了密钥的前提,它也会引发一个问题.
所有这一切使它成为Pythonic.
phi*_*hag 15
print (bool(mydict.get('key')))
Run Code Online (Sandbox Code Playgroud)
或者,在if语句中:
print ('True' if mydict.get('key') else 'False')
Run Code Online (Sandbox Code Playgroud)
如果您不存在的值是错误情况(即您希望它在那里),您应该选择解决方案#2,即
print ('True' if mydict['key'] else 'False')
Run Code Online (Sandbox Code Playgroud)
这允许mydict['key']选择最有效的空定义.对于某些对象(例如簇中的对象),确定实际长度是一个相当复杂的操作,而确定对象是否为空则很简单.
你也可以比较'',即使mydict['key'] == ''你的表达非常清楚.使用len作品,但不是那么直观.
总之,将它留给测试对象来定义它是否为空,然后将其强制转换为bool.
| 归档时间: |
|
| 查看次数: |
39094 次 |
| 最近记录: |