【问题标题】:Python dict.get() or None scenario [duplicate]Python dict.get() 或无场景 [重复]
【发布时间】:2016-05-11 14:17:31
【问题描述】:

我正在尝试根据我拥有的键列表访问字典的值。如果密钥不存在,我默认为无。但是,当值为空字符串“”时,我遇到了麻烦。请参阅下面的代码以获取我的示例

dict = {}
dict['key'] = ''
test = dict.get('key')
print(test)
>>

如上所料,打印出空字符串。但是现在看看如果密钥不存在,我将 dict.get() 函数默认为 None 会发生什么

dict = {}
dict['key'] = ''
test = dict.get('key') or None
print(test)
>> None

为什么会这样?在第二个示例中,密钥存在,因此我的直觉说应该打印 ''。 Python 如何应用该行代码的“或”子句?

下面是我用来访问我的字典的实际代码。请注意,字典中的许多键都有 '' 作为值,这就是我的问题。

# build values list
params = []
for col in cols:
    params.append(dict.get(col) or None)

有没有人可以提供的最佳解决方案?我目前的解决方案如下,但我认为这不是最干净的选择

# build values list
params = []
for col in cols:
    if dict.get(col) is not None:
        params.append(dict.get(col))
    else:
        params.append(None)

【问题讨论】:

  • 对于第一个问题,空字符串在python中是假的,所以打印or运算符的第二个选项
  • 您可以简单地使用dict.get('key')get 如果找不到密钥,则已经返回 None。
  • if dict.get(col) is not None: <use dict.get(col)> ; else: <use None which is the value of dict.get(col)> 真的吗?
  • 可以,谢谢。我不同意它是链接问题的副本,因为我的问题主要涉及 dict.get() 函数的行为。尽管如此,很高兴这已经解决了。
  • 要扩展@TadhgMcDonald-Jensen 的评论,您真的只需要for col in cols: params.append(dict.get(col))。或者您可以进一步简化代码以使用params = [dict.get(col) for col in cols] 使代码成为单行代码,或者如果cols 很大并且您确实需要最后一盎司的性能,params = map(dict.get, cols)(将map 调用包装在list 中,如果您使用的是 Python 3 并且需要 params 成为真正的 list,而不是可以仅迭代一次然后丢弃的惰性生成器)。旁注:不要将您的 dict 命名为“dict”(或任何其他内置名称);名称阴影很糟糕。

标签: python dictionary


【解决方案1】:

你根本不需要or Nonedict.get 在字典中找不到提供的键时,默认返回None

在这些情况下,最好咨询documentation

get(key[, 默认])

如果键在字典中,则返回键的值,否则返回默认值。 如果没有给出默认值,则默认为 None,因此该方法永远不会引发 KeyError。

【讨论】:

    【解决方案2】:

    你可以简单地使用get的第二个参数。

    dict.get(col, None)
    

    第二个参数是找不到密钥时的默认值。 在这种情况下,or 取 or 之前的东西,如果它是某物,否则取 or 之后的东西。

    【讨论】:

    • 请注意,dict.get(col, None)dict.get(col) 100% 相同; dict.getdefault 参数已经是 None,因此显式传递它根本不会改变行为。此外,它并没有真正解决问题,即空字符串是虚假的。
    • .get的第二个参数默认是None,所以OP既不需要or也不需要提供None作为第二个参数。
    【解决方案3】:

    问题是空字符串在 python 中不被认为是 True。例如看看这段代码。

    >>> x = 1 if "" else 0
    >>> y = 1 if True else 0
    >>> z = 1 if False else 0
    

    xz 的值为 0,而y 的值为 1。

    dict.get() returns None by default
    

    或使用defaultdict

    【讨论】:

    • dict.get() 已经返回 None 如果没有找到密钥,默认情况下。
    • 使用bool('') -> False 和指向the relevent documentation 的链接会更容易解释
    猜你喜欢
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    相关资源
    最近更新 更多