我如何增强此 python 代码以执行自然排序的 FQN 主机名和 IP 地址列表?

How can I enhance this python code to do a natural sort of a list of FQN hostnames and ip addresses?

说我有

apple.berry.cherry.za
100.100.100.100
100.100.100.20
apple.berry.banna.au

我想要

100.100.100.20
100.100.100.100
apple.berry.cherry.au
apple.berry.banna.za

我有以下 python 代码按我想要的方式对 FQN 主机名进行排序,但它只对 IP 地址进行字母数字排序:

#!/bin/python
from fileinput import input
for y in sorted([x.strip().split('.')[::-1] for x in input()]): print '.'.join(y[::-1])

我可以添加一个函数将三元组转换为整数:

def atoi(text):
    return int(text) if text.isdigit() else text

但是因为我不知道python,所以我不知道如何在排序之前对列表的每个元素调用atoi()。 怎么办?

您可以使用 map filter 将函数应用于列表的每个元素。所以它会是:

for y in sorted([map(atoi, x.strip().split('.')[::-1]) for x in input()]):
    print '.'.join(y[::-1])

编辑: 正如@Slam 所指出的,如果您决定有一天使用 Python 3,那么翻译上述代码将不会很简单。它不允许您比较整数和字符串。

如果您只希望使用 ipv4 并且这是实时实用程序脚本,您可以尝试像这样的肮脏黑客

sorted(lst, key=lambda x: [i.zfill(3) if i.isdigit() else i for i in x.split('.')][::-1])

如果不是,您可能不会以单行结束。您需要对数字进行自然排序,这不是开箱即用的