由于数据看起来非常规则,因此很容易通过使用key参数确保在 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