在字典中检查多个键不起作用。python

在字典中检查多个键不起作用。python,python,dictionary,Python,Dictionary,我正在编写一个if语句来确定我的字典是否有多个键。如果不是,我只是想通过。我想如果下面的代码没有找到“红移”作为键,它就会通过。但是,当我运行它时,红移不是一个键,它不会通过。我得到一个关键错误。问题是什么。只要找到“红移”或“主机”,它就不会通过 print config[name].keys() if ("redshift" and "host") in config[name]: print config[name].keys()

我正在编写一个if语句来确定我的字典是否有多个键。如果不是,我只是想通过。我想如果下面的代码没有找到“红移”作为键,它就会通过。但是,当我运行它时,红移不是一个键,它不会通过。我得到一个关键错误。问题是什么。只要找到“红移”或“主机”,它就不会通过

        print config[name].keys() 
        if ("redshift" and "host") in config[name]: 
            print config[name].keys() 
            name.append(config[name]["name"])
            redshift.append(config[name]["redshift"][0]['value'])
            type.append(config[name]["type"][0]["value"])
         else:
            pass
config[name]中的表达式
(“红移”和“主机”)不测试两个键是否都存在

(“红移”和“主机”)
只生成
“主机”
,因为
根据其属性返回第一个表达式(如果为false),否则返回第二个表达式。最后,您真正测试的是config[name]
中的表达式“host”

在测试中使用两个单独的

if "redshift" in config[name] and "host" in config[name]:
或使用集合对字典进行以下测试:

config[name]
中的表达式
(“红移”和“主机”)不测试两个键是否都存在

(“红移”和“主机”)
只生成
“主机”
,因为
根据其属性返回第一个表达式(如果为false),否则返回第二个表达式。最后,您真正测试的是config[name]
中的表达式“host”

在测试中使用两个单独的

if "redshift" in config[name] and "host" in config[name]:
或使用集合对字典进行以下测试:


进行此类检查的最有效方法之一是使用集合的交点:

In [62]: config
Out[62]: {'a': 'aaa', 'b': 'bbb', 'c': 'ccc'}

In [63]: len({'a','b'} & config.keys())
Out[63]: 2

In [64]: len({'a','Z'} & config.keys())
Out[64]: 1
因此,检查交叉点的长度将显示是否在关键点中找到了所有值

工作原理:

In [65]: {'a','b'} & config.keys()
Out[65]: {'a', 'b'}

In [66]: {'a','XXX'} & config.keys()
Out[66]: {'a'}

进行此类检查的最有效方法之一是使用集合的交点:

In [62]: config
Out[62]: {'a': 'aaa', 'b': 'bbb', 'c': 'ccc'}

In [63]: len({'a','b'} & config.keys())
Out[63]: 2

In [64]: len({'a','Z'} & config.keys())
Out[64]: 1
因此,检查交叉点的长度将显示是否在关键点中找到了所有值

工作原理:

In [65]: {'a','b'} & config.keys()
Out[65]: {'a', 'b'}

In [66]: {'a','XXX'} & config.keys()
Out[66]: {'a'}

这里的
config
值是多少?请提供一个示例。您在config[name]:
中使用
for la循环,但从未在循环中使用过一次
la
?config以.json文件的形式调用。例如,配置[SNname]。键=[u'Discoveryr',u'redshift',u'claimedtype',u'sources',u'maxabsmag',u'Alias',u'hostdec',u'comovingdist',u'maxappmag',u'maxdate',u'ra u'hostra',u'lumdist u'maxband',u'host u'discoverdate u'dec',u'name',u'Spectrum',u'ebv',u'velocity',u'photometry']是的,我已经取出la循环,它没有目的提示:键入
“红移”和“主机”
这里的
config
值是多少?请提供一个示例。您在config[name]:
中使用
for la循环,但从未在循环中使用过一次
la
?config以.json文件的形式调用。例如,配置[SNname]。键=[u'Discoveryr',u'redshift',u'claimedtype',u'sources',u'maxabsmag',u'Alias',u'hostdec',u'comovingdist',u'maxappmag',u'maxdate',u'ra u'hostra',u'lumdist u'maxband',u'host u'discoverdate u'dec',u'name',u'Spectrum',u'ebv',u'velocity',u'photometry']是的,我已将la环路取出,它没有任何目的提示:键入
“红移”和“主机”
为什么要为交叉口生成一个全新的集合?您只需测试是否有子集。@MartijnPieters,谢谢您的提示!我想这样可能会更快。我已经更新了我的答案。顺便说一句,你的代码只适用于Python3。在Python2中,您必须使用
{…}&config.viewkeys()
[…]
创建一个列表,而不是一个集合,一个不支持
&
运算符的类型。使用
{…}
为什么要为交叉点生成一个全新的集合?您只需测试是否有子集。@MartijnPieters,谢谢您的提示!我想这样可能会更快。我已经更新了我的答案。顺便说一句,你的代码只适用于Python3。在Python2中,您必须使用
{…}&config.viewkeys()
[…]
创建一个列表,而不是一个集合,一个不支持
&
运算符的类型。使用
{…}