【问题标题】:Python3 sort IP addresses 4, 6 and HostnamesPython3 对 IP 地址 4、6 和主机名进行排序
【发布时间】:2021-10-07 15:48:41
【问题描述】:

我正在考虑编写一个对 IP 地址(IPv4 和 6)以及主机名进行排序的函数。例如

127.0.0.1
test.com
10.10.23.4
98.137.246.8
2001:0db8:85a3:0000:0000:8a2e:0370:7334
98.137.246.7

我已经尝试过这段代码,它只适用于 IPv4。有人可以帮助编写一个函数来对所有内容进行排序(如果存在)?

sorted(sorted_ips, key=lambda ip: struct.unpack("!L", inet_aton(ip))[0])

输出应该是,因此按地址升序排序。

10.10.23.4
98.137.246.7
98.137.246.8
2001:0db8:85a3:0000:0000:8a2e:0370:7334
test.com

提前致谢。

【问题讨论】:

  • 应该应用什么排序...?
  • 所以,首先是 IPv4,然后是 IPv6,都按 逻辑 顺序(例如 2.x.x.x100.x.x.x),然后是主机名,最后是 升序 i> 订购?
  • @deceze 是的,这是正确的

标签: python python-3.x sorting


【解决方案1】:

一种使用ipaddress.ip_address的方式:

from ipaddress import ip_address

def ipsorter(s):
    try:
        ip = int(ip_address(s))
    except ValueError:
        return (1, s)
    return (0, ip)

sorted(l, key=ipsorter)

输出:

['10.10.23.4',
 '98.137.246.7',
 '98.137.246.8',
 '127.0.0.1',
 '2001:0db8:85a3:0000:0000:8a2e:0370:7334',
 'test.com']

【讨论】:

  • 如果是ValueError,您可能应该以某种方式使用return s,按字母顺序对主机名进行排序……
  • @deceze hmm.. 好主意,但想不出比较所有 ips 和文本的一般方法:P
  • 返回像(1, ...)(2, ...)(3, ...)这样的元组,其中第一个值取决于s的类型,可能是要走的路。
  • @deceze Wonderful ;) 我已经更新了。通过回答学习,耶!
猜你喜欢
  • 2021-01-18
  • 1970-01-01
  • 2021-11-30
  • 2014-12-19
  • 2014-12-02
  • 2011-11-01
  • 2011-10-02
  • 2016-03-04
  • 1970-01-01
相关资源
最近更新 更多