用于查找列表中的IP是否属于不同子网的Pythonic方法

时间:2016-09-02 15:51:14

标签: python-2.7

我有一个脚本可以为一些校园无线移动交换机生成配置。用户需要为配置提供一组IP地址。

在其他限制条件中,这些IP必须全部位于同一/ 24子网中(始终为/ 24)。为了避免IP位于不同子网中的错别字(这会混淆配置并且已经发生),我想告诉用户哪个IP有问题。我写了以下内容,但我觉得有更好的方法可以做到。

假设列表是这样的,其中第三个IP错误:

ips = ['10.0.0.1', '10.0.0.2', '10.0.10.3', '10.0.0.4', '10.0.0.5']

以下内容完成了工作:

subnets = set()
for ip in ips:
    subnets.add('.'.join(ip.split('.')[0:3]))
    # This would result in subnet being set(['10.0.10', '10.0.0'])
if len(subnets) > 1:
    seen_subnets = defaultdict(list)

    for sn in subnets:
        for ip in ips:
            if sn in ip:
                seen_subnets[sn].append(ip)

    suspect = ''
    for sn in seen_subnets.keys():
        if len(seen_subnets[sn]) == 1:
            suspect = seen_subnets[sn][0]
    if not suspect:
        # Do something to tell the user one or more IP's are incorrect
        # but I couldn't tell which ones

注意:我可以拥有的最小列表有3个项目,我假设可能大多数(如果不是全部)错误只有1个IP。

是否有更简单的方法可以做到这一点?我认为解决方案必须基于使用set的方式,但在我看来,它的任何方法都不会比这更有用。

1 个答案:

答案 0 :(得分:1)

这样的事情会起作用:

this.state