2017-09-11 3 views
0

Ich verwende eine IPv4Network aus dem Modul als Schlüssel in einem dict. Dadurch kann ich schnell nach Duplikaten suchen und andere Daten notieren.IPv4Network-Objekt als Schlüssel im Wörterbuch

Allerdings bin ich neugierig, wenn ich die IN-Anweisungen stapeln und von O (n) Verarbeitung entfernt bleiben kann.

from ipaddress import IPv4Network 
net1 = IPv4Network('10.10.10.0/24') 
net2 = IPv4Network('10.10.10.128/25') 
net3 = IPv4Network('10.10.10.0/24') 

dict1 = {net1: 'Winner!'} 
print(dict1.get(net3)) 
Winner! 

if net3 in dict1: 
    print('Yup') 
Yup 

# -------- This doesn't work, looking for way to accomplish it. 
if net2.network_address in dict1: 
    print('Wouldn't that be nice?) 
# --- Yes I can do this. 
for keys in dict1: 
    if net2.network_address in keys: 
     print(keys, 'I\'m inside you!') 

Irgendwelche Ideen für einen cleveren Trick? Eine Möglichkeit, dies neu zu strukturieren, um einige integrierte Funktionen zu nutzen?

Ich möchte wissen, ob

  1. Der Schlüssel in doppelter Ausführung vorhanden ist (leicht); und
  2. Wenn die IPv4Network als einer der Schlüssel enthalten ist.
+0

Ich habe ein paar Änderungen an der Post vorgenommen, um einige Tippfehler zu korrigieren und die allgemeine Lesbarkeit zu verbessern. In Frage 2 habe ich angenommen, du meintest "IPv4Network", wenn du auf "network" stehst, also habe ich es dort geändert. Fühlen Sie sich frei, diese bestimmte Änderung rückgängig zu machen, wenn Sie denken, dass ich es falsch verstanden habe. – ray

+1

Ich bin müde und habe versucht, mehrere Dinge zu beheben, und Sie schlagen mich auf den Schlag. Ich habe buchstäblich bearbeitet, als es mir sagte, dass du es aktualisiert hast. :) – Allen

Antwort

0

Es gibt keine einfache Möglichkeit zu tun, was Sie wollen. Pythons Wörterbuch-Lookups verwenden Hashing, um exakte Übereinstimmungen für die Schlüssel des Wörterbuchs zu finden. Es gibt keine Möglichkeit, dass der Hash eines Netzwerks mit allen darin enthaltenen Adressen übereinstimmt.

Sie können möglicherweise Ihre eigene Logik schreiben, um ein einzelnes Netzwerk oder eine Adresse effizient in mehreren Netzwerken zu testen. Dieser Code muss jedoch wissen, wie IP-Adressen und Netzwerkmasken funktionieren. Ich würde etwas vorschlagen, das auf einem Trie basiert, mit spezieller Logik, um die Host-Bits zu unterstützen.

if any(net2.network_address in key for key in dict1): 
    ... 

Aber das ist nicht viel schöner als die aktuelle Code:

Wenn Sie nur Ihre geschleift Code auf einer einzigen Zeile schreiben, könnten Sie any verwenden. Es ist auch nicht genau das gleiche, da any Kurzschlüsse nach dem Finden einer einzelnen Übereinstimmung. Der Code any wird nicht mehrfach gedruckt, wenn mehrere Schlüssel die Adresse net2 enthalten. Sie können das Verhalten von any in Ihrem ursprünglichen Looping-Code replizieren, indem Sie in Ihrem Code nach dem print-Aufruf eine break setzen.

Verwandte Themen