Vérifier si une Clé et une valeur existe dans un dictionnaire

Je suis en train de déterminer si une clé et une valeur paire existent dans un dictionnaire; cependant, si j'utilise le contient ou a-clés de la méthode, il vérifie seulement pour la clé. J'ai besoin d'elle pour vérifier à la fois la clé et la valeur spécifique. Un peu de contexte:
Nous avons un total de 4 dictionnaires: l'un pour Un, B, CompareList, et de la liste de Modifications. Une fois initialisé, j'ai mis le contenu dans CompareList (je voudrais les comparer directement, mais A et B sont à double tables de hachage. Et j'ai essayé toutes les méthodes ici; mais aucun d'eux de travailler pour moi). Donc, une fois que nous avons mis en CompareList, je le compare avec le ObjectAttributes dictionnaire en B pour voir si quelque chose a changé. Ainsi, par exemple, B a la clé,des paires de valeurs de la forme:cercle et le remplir:non. Si CompareList avait la forme:cercle et le remplir:oui, alors je veux remplir uniquement:oui liste de Modifications. Le problème réside dans le "si des attributs.getName() non pas dans l'auto.CompareList:" la ligne. Voici le code; je suis en cours d'exécution sur Python 2.7.8. Merci d'avance pour toute aide!!

class ObjectSemanticNetwork:
def __init__(self):
self.ObjectNames = {}
self.ObjectAttributes = {}
def setName(self, name):
self.ObjectNames[name] = self.ObjectAttributes
def setData(self, name, attribute):
self.ObjectAttributes[name] = attribute
def checkData(self, key):
print(key)
for key, value in self.ObjectAttributes.iteritems():
print(key)
print(value)
print("\n")
class Agent:
(self):
self.CompareList = {}
self.ChangeListAB = {}
self.ChangeListCD = {}
def addToCompareList(self, name, value):
self.CompareList[name] = value
def addToChangeListAB(self, name, value):
self.ChangeListAB[name] = value
def addToChangeListCD(self, name, value):
self.ChangeListCD[name] = value
def CheckList(self, List, ListName):
print '-------------------------',ListName,'--------------------------------'
for key, value in List.iteritems():
print(key)
print(value)
def Solve(self,problem):
OSNAB = ObjectSemanticNetwork()
for object in problem.getFigures().get("A").getObjects():
for attributes in object.getAttributes():
self.addToCompareList(attributes.getName(), attributes.getValue())
OSNAB.ObjectNames["A"] = OSNAB.setData(attributes.getName(), attributes.getValue())
#OSNAB.checkData("A")
self.CheckList(self.CompareList,"CompareList")
for object in problem.getFigures().get("B").getObjects():
for attributes in object.getAttributes():
if attributes.getName() not in self.CompareList:
self.addToChangeListAB(attributes.getName(), attributes.getValue())
OSNAB.ObjectNames["B"] = OSNAB.setData(attributes.getName(), attributes.getValue())
# OSNAB.checkData("B")
self.CheckList(self.ChangeListAB,"ChangeList")
OSNCD = ObjectSemanticNetwork()
for object in problem.getFigures().get("C").getObjects():
for attributes in object.getAttributes():
OSNCD.ObjectNames["C"] = OSNCD.setData(attributes.getName(), attributes.getValue())
# OSNCD.checkData("C")
for object in problem.getFigures().get("1").getObjects():
for attributes in object.getAttributes():
OSNCD.ObjectNames["D"] = OSNCD.setData(attributes.getName(), attributes.getValue())
# OSNCD.checkData("D")
return "6"
  • quel est le problème avec key in dictionary and dictionary[key] == value?
  • Le problème avec cette façon (et je devrais l'avoir précisé plus tôt), c'est que parce que je fais BEAUCOUP d'itérations, à l'aide d'un "et" dans l'instruction if permettrait d'ajouter de temps. Nous avons à optimiser autant que possible; de sorte que toute charge supplémentaire à un problème compliqué, c'est mauvais. Merci pour votre aide.
  • vraiment? la création de nouveaux try/except piles (comme dans a accepté de répondre) est plus rapide dans votre cas, qu'un simple petit and opérateur? Je suppose que les touches presque toujours existent déjà dans votre cas ou peut-être les compilateurs peuvent optimiser mieux.. qu'est-ce que la différence de temps de votre profilage plz - est de l'amélioration de l'ordre de grandeur?
  • En cas de doute, de profil. Les deux key in dictionary et dictionary[key] == value sont mis en œuvre dans C. Le coût supplémentaire d'essayer, sauf dans un Python niveau de la fonction doit faire checkKeyValuePairExistence de moins en moins efficace.
  • J'ai ajouté quelques timings de ma réponse. Check it out.
  • J'ai fini par prendre la fonction; vous avez eu raison. On m'a toujours dit que les langages de script ont été beaucoup plus lent que C++, donc je n'étais pas sûr de savoir comment vrai c'était. Merci pour votre aide.