由于数据看起来非常规律,因此使用键参数确保在Python中正确排序相当容易。这用于为要排序的列表中的每个实例创建一个“排序键”。人们经常使用lambda作为排序键功能,但为了完整起见,我们将在这里使用一些有用的东西。
在Python中进行排序之前,重复删除操作更好。由于无论如何都必须对列表进行排序,因此将其转换为集合将导致唯一字符串的任意排序并不重要,如果排序在Python中无关紧要,那么“简单化”列表的简单方法如下所示: l是
l = list(set(l))
你的测试数据选择不当,顺便说一句,因为它会正确地排序(只是偶然)对词汇的排序。所以,如果在地址中包含一些包含两位和三位数组件的示例,情况会变得更好,所以这不再适用。我通过解释的方式展示了非工作排序。
In [42]: data = """\
4.4.4.4/32
4.2.2.2/32
4.4.4.4/32
4.2.2.2/32
4.2.2.2/28
4.4.4.4/24
2.2.2.2/32
12.13.14.15/24
11.12.13.14/24""".splitlines()
In [43]: data.sort()
In [44]: data
Out[44]:
['11.12.13.14/24',
'12.13.14.15/24',
'2.2.2.2/32',
'4.2.2.2/28',
'4.2.2.2/32',
'4.2.2.2/32',
'4.4.4.4/24',
'4.4.4.4/32',
'4.4.4.4/32']
In [45]: data = list(set(data))
In [46]: data.sort()
In [47]: data
Out[47]:
['11.12.13.14/24',
'12.13.14.15/24',
'2.2.2.2/32',
'4.2.2.2/28',
'4.2.2.2/32',
'4.4.4.4/24',
'4.4.4.4/32']
In [48]: def sortkey(addr):
....: add, pref = addr.split("/")
....: a, b, c, d = (int(x) for x in add.split("."))
....: return a, b, c, d, int(pref)
....:
In [49]: data.sort(key=sortkey)
In [50]: data
Out[50]:
['2.2.2.2/32',
'4.2.2.2/28',
'4.2.2.2/32',
'4.4.4.4/24',
'4.4.4.4/32',
'11.12.13.14/24',
'12.13.14.15/24']
它并没有太大的关系,该排序键的功能是在Python,因为它仅适用于一次每个列表值作为“装饰/排序/去除装饰”算法的一部分。更一般地说,对于这个问题域,您可能会发现ipaddress模块有帮助:http://docs.python.org/dev/howto/ipaddress.html
为什么简单的'sort -u'不够? – Kevin
谢谢。排序-u很好,但我正在寻找一个Python/Perl脚本。应该清楚地表明我的问题。 – rtinflux
您的预期产出是多少?你的意思是消除重复的IP,无论/ 32,/ 28,...? –