问题: 有 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)的额外优势,从而避免在下一次迭代中再次重新检查这些元素
最佳答案
这里有一个带有计数器和设置的解决方案。
此外,它只定义一次 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')}
。
关于python - 迭代列表项时减少列表的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53253691/