GOOGLE ADS

понедельник, 2 мая 2022 г.

Как отсортировать список списков с IP-подсетями python

Я полный нуб, и Google сделал мой первый скрипт на Python.

Я открываю 2 файла и удаляю список 1 из списка 2.

После того, как list2 был изменен, чтобы удалить то, что было в списке 1, я хочу отсортировать список по IP-сети. Например:

1.1.1.1/24
1.1.1.1/32
5.5.5.5/20
10.10.11.12/26
10.11.10.4/32

сейчас идет сортировка

1.1.1.1/24
1.1.1.1/32
10.10.11.12/26
10.11.10.4/32
5.5.5.5/20

код:

import os
import sys
import random
import re
text_file = open("D:/file/update2.txt", "rt")
lines = str(text_file.readlines())
text_file.close()
ip_address = r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]
{1,3}/\d{1,2})'
foundip = re.findall( ip_address, lines )
text_file2 = open("D:/file/Block.txt", "rt")
lines2 = str(text_file2.readlines())
text_file2.close()
foundip2 = re.findall( ip_address, lines2 )
test =(list(set(foundip2) - set(foundip)))
items = sorted(test)
print (*items, sep = "\n")

Заранее спасибо.


Решение проблемы

сортировка по умолчанию — буквенно-цифровая сортировка. Вам нужно сгенерировать целочисленные кортежи из ваших IP-адресов, чтобы использовать их в качестве функции ключа сортировки. Я использую re.findallвыражение с цифрами, а затем конвертирую в int (но есть и другие решения, splitнапример, с)

import re
ip_list = """1.1.1.1/24
1.1.1.1/32
10.10.11.12/26
10.11.10.4/32
5.5.5.5/20""".splitlines()
print(sorted(ip_list,key=lambda x: [int(m) for m in re.findall("\d+",x)]))

печатает:

['1.1.1.1/24', '1.1.1.1/32', '5.5.5.5/20', '10.10.11.12/26', '10.11.10.4/32']

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...