2016-05-07 37 views
0

我正在写if语句来确定我的字典是否有多个键。如果不是,我只是想通过。我想如果下面的代码没有找到“红移”作为它会通过的关键。但是,当我运行它红移不是一个关键,它不通过。我收到一个重要错误。问题是什么。只要它发现“红移”或“主人”,它就不会通过。检查字典中的多个键不起作用。 python

 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 
+0

什么的'值这里config'?请举一个例子。 – AKS

+1

你正在循环使用'在配置[名称]为la:'但从未在循环内使用'la'一次? – AKS

+0

config以表单的.json文件形式调用。一个例子是,config [SNname] .keys = [u'discoverer',u'redshift',u'claimedtype',u'sources',u'maxabsmag',u'aliases',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'spectra',u'ebv',u'velocity',u'hothotometry'] – astrochris

回答

3

表达式("redshift" and "host") in config[name]不测试两个键是否存在。

("redshift" and "host")产生只是"host",因为and返回所述第一表达式,如果假根据其truth value,否则返回第二个表达式。所以最后,你真正测试的是表达式"host" in config[name]

使用两个单独的in测试:

if "redshift" in config[name] and "host" in config[name]: 

或测试一组对字典,set.issubset()

if {'redshift', 'host'}.issubset(config[name]): 
+0

是就是这个!谢谢你:) – astrochris

0

的最有效的方式做这样的检查之一是使用十字路口的套:

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'} 
+0

为什么要生成一个全新的交集?所有你需要测试的是如果有一个子集。 –

+0

@MartijnPieters,谢谢你的提示!我认为这样可能会更快。我已经更新了我的回答 – MaxU

+0

顺便说一下,你的代码只发布在Python 3上。在Python 2中,你必须使用'{...}&config.viewkeys()'。 –