检查字典中的值是否已定义/长度为零的最Pythonic方式

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.

  • @AdamParkin - 因为`[]`可以引发一个`KeyError`,而`get`则不会. (3认同)
  • 如果键存在,@AdamParkin .get 将返回给定键的值,否则返回 None。所以这是你问题的正确答案。 (2认同)
  • @Unode:`.get()`将返回`None`,其值为'False`,这意味着他有两种情况返回`False`:键上的零长度值(好)和键不是在`mydict` - 这可以掩盖错误,其中键应该在`mydict`但不是(坏).这不是@ AdamParkin要求的正确答案. (2认同)