我是一个完全菜鸟,并且让Google做了我的第一个python脚本。
我正在打开2个文件,并从list2中删除列表1。
一旦修改了list2以删除列表1中的内容,我想按IP网络对列表进行排序。 例如:
@sys.any:save_response
当前正在排序
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
谢谢。
答案 0 :(得分:2)
默认排序是字母数字排序。您需要从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']
答案 1 :(得分:1)
您的问题源于一个事实,即字母排序未达到您想要的目的(发现10.x比5.x“小”)。因此,您需要传递一个将ip地址字符串转换为数字的函数,以便该函数可以按照您的直觉来判断。
解决方案:我将首先为IP创建一个类型,将字符串分为4组和端口,然后根据这些元组进行比较(请参阅python元组排序)。
from collections import namedtuple
ip_type = namedtuple("IP", 'g1 g2 g3 g4 port')
def to_ip(string: str) -> ip_type:
groups, port = string.split('/')
g1, g2, g3, g4 = [int(g) for g in groups.split('.')]
return ip_type(g1, g2, g3, g4, int(port) )
array = [ '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' ]
print(sorted(array, key=to_ip))