我如何增强此 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])
如果不是,您可能不会以单行结束。您需要对数字进行自然排序,这不是开箱即用的
说我有
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])
如果不是,您可能不会以单行结束。您需要对数字进行自然排序,这不是开箱即用的