python - 迭代列表项时减少列表的长度

标签 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)的额外优势,从而避免在下一次迭代中再次重新检查这些元素

最佳答案

这里有一个带有计数器和设置的解决方案。

此外,它只定义一次 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')}

关于python - 迭代列表项时减少列表的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53253691/

相关文章:

python - 无法通过子处理捕获 os 错误

javascript - 在Python和Beautiful Soup Web Scraping中提取Javascript变量对象数据

python - 在 Mac OS 10.6 上安装 virtualenv 时出错

c - 我试图让一个字符串只接受字母和空格,但不接受数字

java - 在记录器调试语句中使用字符串文字

python - 计算 python 中发生的迭代次数

python - socket ? python -m SimpleHTTPServer

Python 对象数学

C++ 不接受对象字符串中的@ 符号?似乎是地址问题?

python - 如何在 Python 中的新型类上正确覆盖 __setattr__ 和 __getattribute__?