由於數據看起來非常規律,因此使用鍵參數確保在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,...? –