如何增强此python代码,使其成为FQN主机名和ip地址的自然列表?

如何增强此python代码,使其成为FQN主机名和ip地址的自然列表?,python,sorting,ip-address,Python,Sorting,Ip Address,说我有 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 inpu

说我有

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()。
如何操作?

您可以使用将函数应用于列表中的每个元素。所以应该是:

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

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

如果您希望只使用ipv4,而这是一个实时实用程序脚本,您可以尝试类似脏破解的方法

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

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

为什么
cherry
排序在
banna
之前?@unutbu主机名从右到左排序,从域名开始,整数排序在字符串之前?您的解决方案也从右到左排序数字IP。这是预期的吗?在默认的字母排序中,数字在字母之前。我不在乎数字是在字符串之前还是之后。我的示例从左到右显示IP,只是因为我希望在单行代码中插入atio()时会发生这种情况。OP显然使用了Python2.print,但这根本不是问题。py3将为int-str comparisonAh引发错误,您完全正确。我会在答案上加一条注释。