データは非常に規則的であるように見えるため、キー引数を使用して Python で正しい並べ替えを行うのはかなり簡単です。これは、ソートされるリスト内の各インスタンスの「ソート キー」を作成するために使用されます。ソートキー関数としてラムダをよく使用しますが、ここでは完全を期すために、便利なものを定義します。
重複の削除は、Python での並べ替えの前に行ったほうがよいでしょう。リストはとにかくソートする必要があるため、それをセットに変換すると一意の文字列が任意の順序になることは問題ではありません。Python で順序が問題にならない場合、リストlを「一意化」する簡単な方法は次のとおりです。
l = list(set(l))
ところで、あなたのテストデータは、字句ソートで正しく (偶然に) ソートされるため、不適切に選択されています。したがって、住所に 2 桁と 3 桁のコンポーネントを含む例をいくつか含めた方がはるかによいので、これはもはや真実ではありません。説明として、動作しない並べ替えを示します。
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