2017-09-11 13 views
0

私は、ipaddressモジュールのIPv4Networkを辞書としてキーとして使用しています。これにより、私は素早く複製を探して、他のデータを書き留めることができます。辞書のキーとしてIPv4Networkオブジェクト

しかし、IN文をスタックして、O(n)処理から離しておくことができるのは不思議です。

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!') 

巧妙なトリックのアイデアはありますか?組み込みのものを利用するためにこれを再構築する方法?私は

  1. キーは(簡単に)重複して存在するかどうかを知りたい

  2. IPv4Networkがキーの1つとして含まれている場合。
+0

いくつかの誤字を訂正して全体的な可読性を向上させるために、投稿をいくつか編集しました。あなたが '' network "'を参照したとき、あなたが '' IPv4Network'を意味すると仮定したので、私はそれを変更しました。私が間違っていると思ったら、その特定の変更をロールバックしてください。 – ray

+1

私は疲れていて、いくつかのことを修正しようとしていました。私は文字通りあなたがそれを更新したと言ったときに編集していました。 :) – Allen

答えて

0

あなたが望むことを行う簡単な方法はありません。 Pythonの辞書検索では、辞書のキーと完全に一致するものを効率的に見つけるためにハッシングが使用されます。ネットワークのハッシュが含まれているすべてのアドレスと一致する方法はありません。

複数のネットワークに対して1つのネットワークまたはアドレスを効率的にテストする独自のロジックを記述することは可能かもしれませんが、IPアドレスとネットワークマスクの仕組みを知る必要があります。私はホストビットをサポートする特別なロジックを備えたTrieに基づいて何かを提案します。

あなただけの単一の行にあなたのループしたコードを書きたい場合は、あなたがanyを使用することができます。

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

しかし、それはあなたの現在のコードよりも非常に良くありません。 1回のマッチを見つけた後にanyの短絡が発生しているため、これもまったく同じではありません。複数のキーにnet2のアドレスが含まれていると、anyコードは複数回印刷されません。あなたのコードにprint呼び出しの後にbreakを入れて、元のループコードのanyの動作を複製することができます。