如何使用IP子网对列表列表进行排序

时间:2019-03-18 19:32:08

标签: python list networking cidr

我是一个完全菜鸟,并且让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

谢谢。

2 个答案:

答案 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))