Два пути.Простой способ:
IP-адреса сравнивать октет за октетом.Интересно, что списки Python сравниваются поэлементно.Поэтому, если вы просто разделите IP-адреса по точкам и сопоставите список с int
, вы сможете сравнить их правильно.
Еще более простой способ:
ipaddress.ip_address
сопоставим, еслисравниваемые адреса имеют одинаковую версию (IPv4 или IPv6).
Однако сравнение строк не обеспечивает правильного упорядочения IP-адресов:
'1.12.1.1' < '1.2.1.1'
# => True (should be False)
За исключением этих проблем, ваш кодхорошо.Это может быть написано более кратко:
import ipaddress
arps = ['10.20.30.130','10.20.30.131','10.20.30.132', '10.20.30.133',
'10.20.30.136', '10.20.30.137', '10.20.30.138', '10.20.30.139',
'10.20.30.140', '10.20.30.141', '10.20.30.143', '10.20.30.149']
start_ip = "10.20.30.132"
end_ip = "10.20.30.142"
start_ip_ip = ipaddress.ip_address(start_ip)
end_ip_ip = ipaddress.ip_address(end_ip)
sum(1 for ip in arps if start_ip_ip <= ipaddress.ip_address(ip) <= end_ip_ip)
# => 8
Если вы специально хотите видеть адреса в определенной подсети, вам даже не нужно использовать начальный и конечный адреса, если вы знаете спецификацию подсети:
ipaddress.ip_address('192.168.1.17') in ipaddress.ip_network('192.168.0.0/16')
# => True