Python dict.get()或无场景

Python dict.get()或无场景,python,dictionary,Python,Dictionary,我正试图根据我拥有的键列表访问字典的值。如果该键不存在,则默认为无。但是,当值为空字符串“”时,我遇到了问题。请参阅下面的代码以了解我的示例 dict = {} dict['key'] = '' test = dict.get('key') print(test) >> 如上所述,将打印空字符串。但是现在看看如果不存在键,当我将dict.get()函数默认为None时会发生什么 dict = {} dict['key'] = '' test = dict.get('key') or

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

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如何应用该行代码的'or'子句

下面是我用来访问字典的实际代码。请注意,字典中的许多键都将“”作为值,因此我的问题就出现了

# 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)

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

dict.get(col, None)
第二个参数是找不到密钥时的默认参数。
在这种情况下,or取or之前的内容,如果它是某物,则取or之后的内容。

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

>>> x = 1 if "" else 0
>>> y = 1 if True else 0
>>> z = 1 if False else 0
x
z
的值将为0,而
y
的值将为1

dict.get() returns None by default

或者通过使用您不需要
或根本不需要
dict.get
在字典中找不到提供的键时,默认情况下返回
None

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

获取(键[,默认])

如果键在字典中,则返回键的值,否则为默认值如果未指定默认值,则默认为“无”,因此此方法不会引发KeyError


至于第一个问题,在python中空字符串是错误的,因此打印了
运算符的第二个选项。您只需使用
dict.get('key')
<如果找不到键,code>get
已经返回None。
如果dict.get(col)不是None:;其他:
真的吗?好的,谢谢。我不同意这是链接问题的重复,因为我的问题主要涉及dict.get()函数的行为。尽管如此,还是很高兴这个问题得到了解决。要扩展@Tadhgmandald Jensen的评论,您只需要为cols:params.append(dict.get(col))中的col添加
。或者您可以进一步简化,使代码成为一个带有
params=[dict.get(col)for col in cols]
的单行程序,或者如果
cols
很大,并且您确实需要最后一盎司的性能,
params=map(dict.get,cols)
(如果您使用的是Python 3并且需要
params
成为一个真正的
list
,而不是一个可以重复一次然后丢弃的惰性生成器,请将
map
调用
list
)。旁注:不要将您的
dict
命名为“dict”(或任何其他内置名称);名称隐藏是不好的。
dict.get()默认情况下,如果找不到密钥,则
已返回
None
。使用
bool(“”)->False
和提醒您的链接可以更容易地解释这一点,
dict.get(col,None)
dict.get(col)完全相同
;dict.get
default
参数已经是
None
,因此显式传递它根本不会改变行为。此外,它也没有真正解决问题,即空字符串是错误的。
.get
的第二个参数的默认值是
None
,因此OP不需要
de>或提供
None
作为第二个参数。