Если я правильно вас понимаю, вы хотите совпадать только на основе того, что первые 24 бита (/ 24) идентичны.Для этих задач я рекомендую set
:
iplist = ['137.226.161.121', '134.130.4.1', '137.226.161.149', '137.226.161.221', '137.226.161.240', '137.226.161.237', '8.8.8.8', '8.8.4.4', '137.226.161.189', '137.226.161.245', '137.226.161.172', '137.226.161.241', '137.226.161.234', '137.226.161.236', '134.130.5.1']
ipset = set()
for i in iplist:
ipset.add(".".join(i.split(".")[:-1]))
ipranges = [p + ".0/24" for p in ipset]
print(ipranges)
Это печатает: ['134.130.5.0/24', '8.8.4.0/24', '8.8.8.0/24', '134.130.4.0/24', '137.226.161.0/24']
Так что же делает этот код?
Сначала мы перебираемперечислите и обрежьте последний сегмент каждого IP:
segments = "8.8.8.8".split(".") # segments == ["8", "8", "8", "8"]
segments_cut = segments[:-1] # segments_cut == ["8", "8", "8"]
prefix = ".".join(segments_cut) # prefix == "8.8.8"
Теперь мы добавим эти префиксы к set
.Python set
допускает только уникальные элементы.Это приводит к: ìpset == {'134.130.5', '8.8.4', '8.8.8', '134.130.4', '137.226.161'}
Наконец, мы перебираем множество и добавляем суффикс ".0 / 24" для обозначения подсети.
Редактирование: Об "эффективности"
Мне нравится ответ от darkless , но я просто знаю, что мое решение значительно быстрее (1,2 с против 0,09 с):
>>> import timeit
>>> # darkless' ipaddress solution
>>> timeit.timeit("[str(ipaddress.ip_network('{}/24'.format(ip), strict=False)) for ip in iplist]", setup="import ipaddress;iplist = ['137.226.161.121', '134.130.4.1', '137.226.161.149', '137.226.161.221', '137.226.161.240', '137.226.161.237', '8.8.8.8', '8.8.4.4', '137.226.161.189', '137.226.161.245', '137.226.161.172', '137.226.161.241', '137.226.161.234', '137.226.161.236', '134.130.5.1']", number=10000)
1.186...
>>> # My solution
>>> timeit.timeit("[p + '.0/24' for p in {'.'.join(i.split('.')[:-1]) for i in iplist}]", setup="import ipaddress;iplist = ['137.226.161.121', '134.130.4.1', '137.226.161.149', '137.226.161.221', '137.226.161.240', '137.226.161.237', '8.8.8.8', '8.8.4.4', '137.226.161.189', '137.226.161.245', '137.226.161.172', '137.226.161.241', '137.226.161.234', '137.226.161.236', '134.130.5.1']", number=10000)
0.096...