2016-04-12 11 views
0

ich ein Tupel Struktur in meinem Python-Code, der Folgendes erklärt:Suche nach einem Tupel innerhalb eines dict

match_entry = (util.frozendict(rule_match), priority, version) 

Als ich match_entry drucken, sehe ich folgendes:

print match_entry 
({'switch': 1, 'dstmac': 00:00:00:00:00:01, 'srcmac': 00:00:00:00:00:01}, 60000, 5) 

Ich bin Suche nach diesem bestimmten Tupel ein Diktat von Tupeln, nennen wir es dict_of_tuples; Der entsprechende Ausgang für das Diktat ist unten.

print dict_of_tuples 

{({'switch': 5, 'dstmac': '00:00:00:00:00:00', 'srcmac': '00:00:00:00:00:01'}, 59999, 7): [CountBucket 140271056467472, CountBucket 140271056411280], ({'switch': 5, 'dstmac': '00:00:00:00:00:00', 'srcmac': '00:00:00:00:00:01'}, 59999, 5): [CountBucket 140271056467472, CountBucket 140271056411280], ({'switch': 1, 'dstmac': '00:00:00:00:00:01', 'srcmac': '00:00:00:00:00:01'}, 60000, 5): [CountBucket 140271057099664, CountBucket 140271056501008]} 

Allerdings, wenn ich überprüfen, ob das Spiel Eintrag im Tupel ist:

if match_entry in dict_of_tuples: 

Ich habe keine Ergebnisse sehen, obwohl die match_entry deutlich in dict_of_tuple ist. Warum sollte dies der Fall sein?

+0

Sicher sind sie dict & Tupel nicht String? – knh170

+0

Der mit ''srcmac'' verknüpfte Wert scheint in einem Fall eine Zeichenfolge und im anderen Fall eine Art Nicht-Zeichenfolgenobjekt zu sein. – user2357112

+0

Bdw, was ist '00: 00: 00: 00: 00: 01'? Ich weiß was "00: 00: 00: 00: 00: 01" 'ist aber nicht der frühere. –

Antwort

0

Wörterbuch ist nicht hashable, so dass ich denke, Ihre Struktur nicht möglich sein kann:

>>> {({1:2, 2:3}, 2, 3): [1,2,3]} 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'dict' 

Wörterbuch erlaubt es nicht, eine dict in seine Schlüssel vorhanden ist. Also stellen Sie sicher, dass es wirklich ein Diktat ist, nicht so etwas wie String.

bearbeiten:

Wie mentioned in Kommentar, ein gefroren dict (unveränderlich dict) hashable sein wird, löst daher dieses Problem. Sie müssen jedoch den Standarddict-Typ ändern. Normalerweise können Sie eine dict zur Laufzeit ändern:

d = {} 
d["key"] = "val" 

Es aktiviert mit __setattr__ in Object. Wann brauchen wir unveränderliche Klassen? Grundsätzlich sind unveränderliche Objekte effizienter im Speicher. Hier ist a topic darüber.

+0

Das Diktat ist ein eingefrorenes Diktat. Es ist also waschbar. –

+1

@CPanda Ah, neues Wissen. Aber ich überprüfte dies: http://stackoverflow.com/questions/2703599/what-would-a-frozen-dict-be, und der Test ist wirklich gescheitert. Ich erinnerte mich, dass ein eingefrorenes Objekt erstellt werden konnte, indem man '__slot__' manuell änderte. – knh170

+0

Sorry Kumpel, mein Schlechter. Ich habe die ganze Zeit über gefrorene Sets nachgedacht. –

0
 import frozendict as util 
     from collections import defaultdict 

     ### Create the first entry using hashable frozendict 
     match = util.frozendict({'switch': 1, 'dstmac': '00:00:00:00:00:01', 'srcmac': '00:00:00:00:00:01'}) 
     match_array = tuple[match,60000,5] 
     count_bucket2 = dict(CountBucket1 = 140271057099664, CountBucket2 = 140271056501008) 

     ### Create the second entry using hashable frozendict 
     match_entry = util.frozendict(switch= 5, dstmac= '00:00:00:00:00:00', srcmac= '00:00:00:00:00:01') 
     match_array1 = tuple([match_entry, 59999, 7]) 

     count_bucket1 = dict(CountBucket1 = 140271056467472, CountBucket2 = 140271056411280) 

     # Initialize the dictionary of tuples 
     dict_of_tuples = ({tuple(match_array) : count_bucket2},{tuple(match_array1) : count_bucket1}) 

     ####### Your match entry 
     match_entry = [{'switch': 1, 'dstmac': '00:00:00:00:00:01', 'srcmac': '00:00:00:00:00:01'},60000,5]     

    #Treating the final structure as a tuple. Each element of the tuple is a #dictionary. 
     k = 0 
     while k < len(dict_of_tuples): 
      key = dict_of_tuples[k].iterkeys() 
      val = dict_of_tuples[k].itervalues() 
      if key.next() == tuple(match_entry): 
       print ('Has key','corresponding value',val.next()) 
      else: 
       print "Key not present" 
      k+= 1 
+0

Behandeln der endgültigen Struktur als Tupel. Jedes Element des Tupels ist ein Wörterbuch. – Tammy

Verwandte Themen