IPv4Network对象作为字典

时间:2017-09-11 05:59:00

标签: python python-3.x object dictionary

我正在使用IPv4Network模块中的ipaddress作为词典中的键。这使我可以快速查找重复,并记下其他一些数据。

但是,我很好奇我是否可以堆叠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 :(得分:0)

没有简单的方法可以做你想做的事。 Python的字典查找使用散列来有效地找到字典键的精确匹配。网络的散列无法匹配它包含的所有地址。

您可以编写自己的逻辑来有效地针对多个网络测试单个网络或地址,但该代码需要了解IP地址和网络掩码的工作方式。我建议基于Trie的东西,用特殊的逻辑来支持主机位。

如果您只想在一行上编写循环代码,可以使用any

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

但这并不比你现在的代码好多了。它也不完全相同,因为在找到单个匹配后any短路。因此,如果多个密钥包含any的地址,net2代码将不会多次打印。您可以在原始循环代码中复制any的行为,方法是在代码中break调用后添加print