问题: 有2个列表,一个被视为父级,另一个被视为子级。我要做的是根据条件构造第三个列表。
当前解决方案:
from netaddr import *
l1 = ['10.0.0.0/8', '172.16.0.0/16']
l2 =['10.10.10.10','172.16.15.0/24','10.20.10.0/24','13.1.1.0/24','15.10.10.0/24','172.16.16.0/25','10.10.11.11']
[ip1 for ip1 in l1 for ip2 in l2 if IPNetwork(ip2) in IPNetwork(ip1)]
输出:
['10.0.0.0/8', '10.0.0.0/8', '10.0.0.0/8', '172.16.0.0/16', '172.16.0.0/16']
我认为上述理解不是最佳解决方案
我正在寻找我可以重新实现上述解决方案的方法,其附加优点是在每次迭代中都删除了与l2匹配的元素(请参阅ip2),从而避免了在下一次迭代中再次检查这些元素
答案 0 :(得分:0)
这里有一个带有计数器和集合的解决方案。
此外,它仅定义一次IPNetwork对象,这是最慢的操作(n2 in n1
仅花费5µs时花费50µs)。
from collections import Counter
cnt=Counter()
S2=set(IPNetwork(ad2) for ad2 in l2)
for ad1 in l1:
n1=IPNetwork(ad1)
found=set()
for n2 in S2:
if n2 in n1:
cnt[ad1]+=1
found.add(n2)
S2 -= found
最后,cnt
是Counter({'10.0.0.0/8': 3, '172.16.0.0/16': 2})
,而S2
是{IPNetwork('13.1.1.0/24'), IPNetwork('15.10.10.0/24')}
。