Python比较两个IP列表并返回列表中最低到0的IP条目?

Python比较两个IP列表并返回列表中最低到0的IP条目?,python,ip-address,Python,Ip Address,我已经设法汇编了两个IP地址列表。已使用和未使用的IP本身 unused_ips = ['172.16.100.0/32', '172.16.100.1/32', '172.16.100.2/32', '172.16.100.3/32', '172.16.100.4/32', '172.16.100.5/32', '172.16.100.6/32', '172.16.100.7/32', '172.16.100.8/32', '172.16.100.9/32'...] used_ips = [

我已经设法汇编了两个IP地址列表。已使用和未使用的IP本身

unused_ips = ['172.16.100.0/32', '172.16.100.1/32', '172.16.100.2/32', '172.16.100.3/32', '172.16.100.4/32', '172.16.100.5/32', '172.16.100.6/32', '172.16.100.7/32', '172.16.100.8/32', '172.16.100.9/32'...]

used_ips = ['172.16.100.1/32','172.16.100.33/32']
我现在想做的是比较这些列表并返回下一个免费IP。在上面的例子中,下一个ip将是172.16.100.2/32,直到它分发所有从1到32的ip,然后它将分发34

我不知道从哪里开始,如果有内置的东西,我可以将它们转换为IPv4Network对象,但我在文档中找不到任何东西


谢谢

如果您只是尝试遍历可用IP的列表,您可以执行以下操作:

# Filter unavailable ips from the list of all ips
available_ips = set(unused_ips) - set(used_ips)

# Iterate through list of available ips
for ip in available_ips:
    print(ip) # Or whatever you want to do with the next available ip

如果您只是尝试遍历可用IP的列表,您可以执行以下操作:

# Filter unavailable ips from the list of all ips
available_ips = set(unused_ips) - set(used_ips)

# Iterate through list of available ips
for ip in available_ips:
    print(ip) # Or whatever you want to do with the next available ip

我会保留一组
ipaddress
对象,并操纵它们来分配和取消分配地址,如下所示:

import ipaddress

def massage_ip_lists():
    global unused_ips, used_ips
    unused_ips = set(ipaddress.ip_address(ip.replace('/32', ''))
                     for ip in unused_ips)
    used_ips = set(ipaddress.ip_address(ip.replace('/32', ''))
                   for ip in used_ips)

def allocate_next_ip():
    new_ip = min(unused_ips - used_ips)
    used_ips.add(new_ip)
    return new_ip

unused_ips = [
    '172.16.100.0/32',
    '172.16.100.1/32',
    '172.16.100.2/32',
    '172.16.100.3/32',
    '172.16.100.4/32',
    '172.16.100.5/32',
    '172.16.100.6/32',
    '172.16.100.7/32',
    '172.16.100.8/32',
    '172.16.100.9/32']
used_ips = ['172.16.100.1/32', '172.16.100.33/32']

massage_ip_lists()
print(allocate_next_ip())
print(allocate_next_ip())
注:

  • /32
    是IP网络的术语,而不是IP主机
  • ipaddress
    对象是可比较的,因此像
    min()
    这样的函数可以处理它们
  • 172.16.100.0
    是完全有效的IP地址,具体取决于网络掩码。如果您不想分配它,请将它放在未使用的IP之外,或者让程序知道正在使用的网络掩码

我会保留一组
ipaddress
对象,并操纵它们来分配和取消分配地址,如下所示:

import ipaddress

def massage_ip_lists():
    global unused_ips, used_ips
    unused_ips = set(ipaddress.ip_address(ip.replace('/32', ''))
                     for ip in unused_ips)
    used_ips = set(ipaddress.ip_address(ip.replace('/32', ''))
                   for ip in used_ips)

def allocate_next_ip():
    new_ip = min(unused_ips - used_ips)
    used_ips.add(new_ip)
    return new_ip

unused_ips = [
    '172.16.100.0/32',
    '172.16.100.1/32',
    '172.16.100.2/32',
    '172.16.100.3/32',
    '172.16.100.4/32',
    '172.16.100.5/32',
    '172.16.100.6/32',
    '172.16.100.7/32',
    '172.16.100.8/32',
    '172.16.100.9/32']
used_ips = ['172.16.100.1/32', '172.16.100.33/32']

massage_ip_lists()
print(allocate_next_ip())
print(allocate_next_ip())
注:

  • /32
    是IP网络的术语,而不是IP主机
  • ipaddress
    对象是可比较的,因此像
    min()
    这样的函数可以处理它们
  • 172.16.100.0
    是完全有效的IP地址,具体取决于网络掩码。如果您不想分配它,请将它放在未使用的IP之外,或者让程序知道正在使用的网络掩码

您需要未使用但未使用的IP:

available_ips = [ip for ip in unused_ips if ip not in used_ips]
您需要对它们进行排序,以得到最接近零的一个。由于您有字符串,简单排序将不起作用;例如,172.16.xxx.xxx排序高于172.100.xxx.xxx。您可以将IP转换为数字列表以正确排序

import re
available_ips = sorted(available_ips, key=lambda ip: (int(n) for n in re.split(r'[./]', ip)))

您需要未使用但未使用的IP:

available_ips = [ip for ip in unused_ips if ip not in used_ips]
您需要对它们进行排序,以得到最接近零的一个。由于您有字符串,简单排序将不起作用;例如,172.16.xxx.xxx排序高于172.100.xxx.xxx。您可以将IP转换为数字列表以正确排序

import re
available_ips = sorted(available_ips, key=lambda ip: (int(n) for n in re.split(r'[./]', ip)))

仅供参考,在Python3中有。未使用的IP不是更合适地命名为“所有IP”还是仅命名为“IP”?看起来,当一个IP被使用时,它在两个列表中,如果列表中的一些IP被实际使用,那么将其命名为未使用的IP是很混乱的。您似乎在IPv4中有网络,掩码中的
32
位设置为1?这不会给主机留下任何空间(所有IP都是为子网设计的)对吗?根据列表值,您可以使用Rob提到的
ipaddress
包将新网络实例化为对象表示
n=IPv4Network('172.16.100.0/32')
FYI,在Python3中有。未使用的IP不是更合适地命名为“所有IP”还是仅命名为“IP”?看起来,当一个IP被使用时,它在两个列表中,如果列表中的一些IP被实际使用,那么将其命名为未使用的IP是很混乱的。您似乎在IPv4中有网络,掩码中的
32
位设置为1?这不会给主机留下任何空间(所有IP都是为子网设计的)对吗?根据列表值,您可以使用Rob提到的
ipaddress
包将新网络实例化为对象表示
n=IPv4Network('172.16.100.0/32')
删除不是这样工作的。您需要一个集合操作。set(unused_-ip)-set(used_-ip)这不是remove的工作方式。您需要一个集合操作。设置(未使用的IP)-设置(已使用的IP)