2016-05-07 7 views
0

Ich schreibe eine if-Anweisung, um festzustellen, ob mein Wörterbuch mehrere Schlüssel hat. Wenn nicht, ich will nur übergeben. Ich dachte, wenn der Code unten "Rotverschiebung" nicht als Schlüssel finden würde, würde es passieren. Allerdings, wenn ich es renne, ist Rotverschiebung kein Schlüssel und es passiert nicht. Ich erhalte einen Schlüsselfehler. Was ist das Problem. Solange es "Rotverschiebung" oder "Host" findet, passiert es nicht.Überprüfung mehrerer Schlüssel in einem Wörterbuch funktioniert nicht. 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

was ist der Wert von 'hier config'? Bitte geben Sie ein Beispiel an. – AKS

+1

Sie verwenden loop mit 'für la in config [name]:' aber nie 'la' in der Schleife einmal verwendet? – AKS

+0

Config wird in Form einer .json-Datei aufgerufen. Ein Beispiel ist config [SNname] .keys = [u'discoverer ', u'redshift', u'claimedtype ', u'sources', u'maxabsmag ', u'aliases', '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'photometry '] – astrochris

Antwort

3

Der Ausdruck ("redshift" and "host") in config[name] prüft nicht, ob beide Schlüssel vorhanden sind.

("redshift" and "host") produziert nur"host", weil and gibt entweder den ersten Ausdruck als falsch, wenn seine truth value nach, ansonsten den zweiten Ausdruck zurückgegeben wird. Am Ende testen Sie also nur den Ausdruck "host" in config[name].

zwei getrennte in Tests:

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

oder Test für einen Satz gegen das Wörterbuch mit set.issubset():

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

ja Das ist es! Danke dir :) – astrochris

0

eine der effizientesten Möglichkeiten, eine solche Prüfung zu tun ist, zu verwenden, Schnitte der Sätze:

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 

so die Länge der Überprüfung Kreuzung wird zeigen, ob alle Werte in Schlüssel gefunden

Wie es funktioniert:

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

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

Warum ein ganz neues Set für die Kreuzung produzieren? Alles, was Sie testen müssen, ist, ob es eine Untermenge gibt. –

+0

@MartijnPieters, danke für den Hinweis! Ich dachte, es könnte so schneller sein. Ich habe meine Antwort aktualisiert – MaxU

+0

Ihr Code, wie gepostet, funktioniert übrigens nur auf Python 3. In Python 2 müssten Sie '{...} & config.viewkeys()' verwenden. –

Verwandte Themen