2016-05-07 36 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()'。 –