迭代列表时减少列表的长度

时间:2018-11-11 22:01:55

标签: python string python-3.x list counter

问题: 有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),从而避免了在下一次迭代中再次检查这些元素

1 个答案:

答案 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

最后,cntCounter({'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')}