Python比较两个IP列表并返回列表中最低到0的IP条目?
我已经设法汇编了两个IP地址列表。已使用和未使用的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 = [
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())
注:
是IP网络的术语,而不是IP主机/32
对象是可比较的,因此像ipaddress
这样的函数可以处理它们min()
是完全有效的IP地址,具体取决于网络掩码。如果您不想分配它,请将它放在未使用的IP之外,或者让程序知道正在使用的网络掩码172.16.100.0
的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)