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
etdictionary[key] == value
sont mis en œuvre dans C. Le coût supplémentaire d'essayer, sauf dans un Python niveau de la fonction doit fairecheckKeyValuePairExistence
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.
Vous devez vous connecter pour publier un commentaire.
Comment à propos de cette fonction:
Si vous utilisez un autre type de dictionnaire des autres, puis le python offre (je suis désolé, je ne pourrais pas le comprendre à partir de votre post si vous l'utilisez ou pas) alors laissez-moi savoir et je vais essayer de donner de votre autre solution
Utilisation
Ou (uniquement en Python 3)
En Python 3
d.items()
renvoie une Dictionnaire de vue de l'objet, qui prend en charge rapide de l'adhésion les tests. En Python 2d.items()
renvoie une liste, qui est à la fois lente pour créer et lent pour faire les tests d'adhésion. Python 2.7 est un cas spécial où vous pouvez utiliserd.viewitems()
et obtenir la même chose que vous obtenez avecd.items()
en Python 3.Edit: Dans un commentaire vous devez indiquer que pour des raisons de performances que vous préférez
checkKeyValuePairExistence
surkey in d and d[key] == value
. Ci-dessous sont quelques-uns des timings montrant quecheckKeyValuePairExistence
est toujours plus lente (environ 2x sur mon système lors de la paire clé-valeur est présente 16x quand il ne l'est pas). J'ai aussi testé petits et grands dictionnaires et trouvé peu de variation dans le temps.not value
de la 2ème argument deget
est là pour faire de la non-existant n'est pas égal àNone
(toute autre raison?)None
,d.get(key) == value
serait mal évaluer àTrue
.if value == None and key not in d ...
pour prévenir de futurs maux de tête 🙂checkKeyValuePairExistence
. (Mais bien sûr c'est une question de goût.)Pourquoi ne pas simplement faire ceci: