我正在使用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!')
任何聪明伎俩的想法?一种重构这种方法以利用一些内置的方法吗?
我想知道是否
IPv4Network
作为其中一个键包含在内。答案 0 :(得分:0)
没有简单的方法可以做你想做的事。 Python的字典查找使用散列来有效地找到字典键的精确匹配。网络的散列无法匹配它包含的所有地址。
您可以编写自己的逻辑来有效地针对多个网络测试单个网络或地址,但该代码需要了解IP地址和网络掩码的工作方式。我建议基于Trie的东西,用特殊的逻辑来支持主机位。
如果您只想在一行上编写循环代码,可以使用any
:
if any(net2.network_address in key for key in dict1):
...
但这并不比你现在的代码好多了。它也不完全相同,因为在找到单个匹配后any
短路。因此,如果多个密钥包含any
的地址,net2
代码将不会多次打印。您可以在原始循环代码中复制any
的行为,方法是在代码中break
调用后添加print
。