Python 如何使用IP子网对列表进行排序
我是一个彻头彻尾的noob,谷歌制作了我的第一个python脚本 我正在打开2个文件并从列表2中删除列表1 修改列表2以删除列表1中的内容后,我想按IP网络对列表进行排序。 例如:Python 如何使用IP子网对列表进行排序,python,list,networking,cidr,Python,List,Networking,Cidr,我是一个彻头彻尾的noob,谷歌制作了我的第一个python脚本 我正在打开2个文件并从列表2中删除列表1 修改列表2以删除列表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 代码: 提前感谢。默认排序为字母数字排序。您需要从i
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
代码:
提前感谢。默认排序为字母数字排序。您需要从ip地址生成整数元组以用作排序键函数。我使用带有“digits”表达式的
re.findall
,然后将其转换为int(但还有其他解决方案,例如使用split
)
印刷品:
['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']
您的问题源于这样一个事实,即字母排序并不是您希望它做的事情(发现10.x比5.x“小”)。因此,您需要传递一个将ip地址字符串转换为数字的函数,以便该函数遵循您的直觉,即首先应该做什么 解决方案:我将首先为IP创建一个类型,将字符串解析为4个组和端口,并基于这些元组进行比较(请参见python元组排序) IP地址不是它们的文本表示形式。IPv4地址是32位无符号整数,它们应该以这种方式存储和处理,这样您就不会有这个问题。
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']
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))