2015-01-01 10 views
6

Iterating over dict values - auf diese Frage bezogen werden:Mehrwertsuche im Wörterbuch Schlüssel

def bla(self,x,y) 
    for i in self.DataBase.keys(): 
     for x,y in self.DataBase[i]: 
      if x == dept and y == year: 
       return self.DataBase[i] 

Dies ist mehr von der Idee, dass ich zu erreichen versuchen, wie mache ich einen Schlüssel und für n Werte im Schlüssel suche Geben Sie dann den Schlüssel zurück, wenn die Werte im Schlüssel enthalten sind

+0

kann u ur Eingangsdaten – Hackaholic

+0

ppl = Course zeigen (123, "Grundsätze der Programmiersprachen") os = Kurs (133, 'Betriebssysteme') db = DB) ( db.setCourse (ppl, 'SE', 2, 1) db.setKurs (os, 'SE' , 3, 1) –

+0

Sie sollten Code in die Frage einfügen ('edit' verwenden), da es in Kommentaren nicht gut angezeigt wird. –

Antwort

3

Im Folgenden wird die Methode bla die Datenbankschlüssel zurückgibt, wenn x und y der ersten und zweiten Elemente des Tupels übereinstimmt (gleich welcher Länge) jeweils, die der Schlüssel entsprechen:

def bla(self, x, y) 
    for key, value in self.DataBase.iteritems(): 
     if (x, y) == value[:2]: 
      return key 

Und nun unter das Verfahren, bla die Datenbank Schlüssel zurück, wenn der Datenbankwert, der ein Tupel enthält sowohl x und y:

def bla(self, x, y) 
    for key, value in self.DataBase.iteritems(): 
     if x in value and y in value: 
      return key 
+1

Wurde iteritems() nicht von python 3 entfernt? Ich denke, items() ist was du willst. Siehe meine Antwort. – Bolboa

+0

Ja, für python3 ersetzen Sie einfach .iteritems() durch .items() ohne Funktionalität zu verlieren. – dopstar

2

Da Sie in der Frage "Schlüssel zurückgeben" angegeben haben, nehme ich an, dass Sie die Schlüssel im Wörterbuch isolieren möchten, deren Werte mit einigen Suchparametern übereinstimmen Von Ihnen gepostete Codefragmente geben die Werte zurück, nicht die Schlüssel).

def getMatchingKeys(self, x, y): 
    '''Extract keys whose values contain x and y (position does not matter)''' 
    return [i for i in self.Database if x in self.Database[i] and y in self.Database[i]] 

Keys, deren Werte enthalten sowohl x und y überall im Tupel zurückgegeben werden: Unter der Annahme, self.Database ist ein Wörterbuch, die Schlüssel als Liste Verständnis mit in etwa wie folgt extrahieren könnte. Wenn Sie bestimmte Positionen im Tupel abgleichen müssen, kann die Bedingung innerhalb des Verständnisses in etwas wie if x == self.Database[i][1] and y == self.Database[i][2] geändert werden.

Wenn Sie nicht nach den Schlüsseln sind, erklären Sie bitte Ihre Frage.

+0

krank versuchen, mein Bestes zu erklären, ich habe eine Funktion, die selbst, x, y, was es tun muss, ist in jedem Schlüssel zu suchen, die die Datenbank (Wörterbuch-Datenbank) für das x und ist y wenn x und y in der Datenbank [Schlüssel] den Schlüssel zurückgeben, hoffe ich, dass das verständlicher ist und die Tupel mehr als Größe 2 sind, sie sind 4 oder sogar noch mehr, um nach n Werten in einem Schlüssel zu suchen. –

+0

@ Mike.G Das hilft ein bisschen zu verdeutlichen - ich habe meine Antwort entsprechend bearbeitet. Wie ich in der Antwort erwähne, hängt die genaue Implementierung davon ab, ob Sie irgendwo im Tupel nach x und y suchen wollen oder ob Sie in bestimmten Positionen suchen. – rchang

+0

Ich glaube, das wäre in bestimmten Positionen, dass die Werte sinnvoll sind, die Reihenfolge der Eingabe ist für jeden Schlüssel gleich. Ich meine, der Schlüssel, der die Werte enthält, ist immer die gleichen Positionen für jeden Wert. –

1

Sie können im internen verwenden map() die festlegen x und y Variablen.

def bla(self,x,y) : 
    for key in self.DataBase : 
     x,y = map(float, self.DataBase[key]) 
     if x == dept and y == year: 
      return key 

Wenn Sie items() lieber mit, Sie können auch folgendes tun (gleichermaßen gültig):

def bla(self,x,y): 
    for key, val in self.DataBase.items(): 
     x, y = map(float, val) 
     if x == dept and y == year: 
      return key 

Hier ist noch eine weitere Möglichkeit, es zu tun, ohne map(), das gibt Ihnen den Vorteil, das Auspacken Tupel, während über die dict Iterieren:

def bla(self,x,y): 
    for key, (x, y) in self.DataBase.items(): 
     if x == dept and y == year: 
      return key 

Sie können auch die oben als so schreiben, Liste Verständnis mit, obwohl ich das sagen würde, oben ist bevorzugt:

def bla(self,x,y): 
    found = {key for key, (x, y) in self.DataBase.items() if x==dept and y==year} 
    found = ''.join(num) #joins set into string 
    return found 

Die folgende alle Arbeiten für Python 3, die ich nehme an, was Sie da eine Ihrer Tags wollen, Python 3.x

+1

Die Verwendung von 'map' ist unnötig, da es keinen Grund für die' bla'-Methode gibt, eine Typumwandlung ihrer Argumente in float zu erzwingen. In all Ihren Code-Snippets sind die Argumente 'x' und' y' durch den Neuzuweisungsschritt beschattet, was ihnen die self.DataBase-Werte gibt. Es gibt auch eine Entpackungsfehler-Schwachstelle, da die self.DataBase-Werte angenommen werden werden Tupel oder Listen von genau der Länge 2 (die das OP angegeben, dass es der Fall ist). Ich denke "Tiefe" und "Jahr" sollten die Argumente nicht Globals sein. Ansonsten sind die Argumente für die Signatur der "bla" -Methode nicht erforderlich. – dopstar

Verwandte Themen