在pythonlis中对IP地址的最后八位字节进行排序

2024-06-16 11:49:17 发布

您现在位置:Python中文网/ 问答频道 /正文

这有点让人困惑(至少对我来说)。我使用一个简单的Python脚本,使用fping返回“up”主机的列表。我将每个“up”主机存储在Python列表中,但是列表.排序()显然不会根据存储为字符串的IP地址的最后八位字节进行排序。我想按降序排序。1、.2、.3等

下面是代码的那部分:

for addr in os.popen("fping -a -q -g " + subnet):
    addr = addr.rstrip('\n')
    addr_list.append(addr)

addr_list.sort()
for ip in addr_list:
    print ip

Tags: 字符串代码inip脚本列表for排序
3条回答

假设您的addr_list列表如下(您在问题中没有指定):

addr_list = [
    '10.11.12.13',
    '1.2.3.4',
    '127.0.0.1',
    '192.168.0.1',
]

拆分.,并使用最后一个项(最后一个八位字节)作为排序的键。当然,对于'127.0.0.1'和'192.168.0.1',您可能需要根据最后第二个八位字节、最后第三个八位字节和第一个八位字节进行排序。在

因此将此行为用作key

^{pr2}$

请注意,134之前列出。因此,还要确保将每个项目作为数字而不是字符串进行比较:

>>> sorted(addr_list, key=lambda ip: map(int, reversed(ip.split('.'))))
['127.0.0.1', '192.168.0.1', '1.2.3.4', '10.11.12.13']

将其分配给另一个列表或执行就地排序:

>>> addr_list.sort(key=lambda ip: map(int, reversed(ip.split('.'))))
>>> addr_list
['127.0.0.1', '192.168.0.1', '1.2.3.4', '10.11.12.13']

对于最后一个八位字节,您可以在键中使用rsplit()

addr_list = [  # Thanks @aneroid
    '10.11.12.13',
    '1.2.3.4',
    '127.0.0.1',
    '192.168.0.1',
]

>>> sorted(addr_list, key=lambda x: int(x.rsplit('.', 1)[1]), reverse=True)
['10.11.12.13', '1.2.3.4', '127.0.0.1', '192.168.0.1']

这是在下降-但你的例子似乎是上升的:

^{pr2}$

但我想我更喜欢按@aneroid的元组排序:

>>> sorted(addr_list, key=lambda x: tuple(map(int, reversed(x.split('.')))))
['127.0.0.1', '192.168.0.1', '1.2.3.4', '10.11.12.13']

sort可以将函数用作执行比较的参数。函数接受两个输入,如果第一个参数更大,则返回1;如果第二个参数更大,则返回{};如果为了排序,它们相等,则返回{}。这里有一个针对您案例的函数:

def compare_ips(ip1, ip2):
    last_octet1 = int(ip1.split('.')[-1]) # splits the ip and grabs the last octet
    last_octet2 = int(ip2.split('.')[-1]) # splits the ip and grabs the last octet
    if last_octet1 > last_octet2:
        return 1
    if last_octet1 < last_octet2:
        return -1
    return 0

然后只需将其作为关键字参数来排序:

^{pr2}$

相关问题 更多 >