Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用IP子网对列表进行排序_Python_List_Networking_Cidr - Fatal编程技术网

Python 如何使用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

我是一个彻头彻尾的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
代码:


提前感谢。

默认排序为字母数字排序。您需要从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))