对 IP 地址列表进行排序时出现意外输出

Rea*_*too -1 python sorting list

我正在尝试从以下列表中对 IP 地址列表进行排序。

IPlist= ['209.85.238.4', '216.239.51.98', '64.233.173.198', '64.3.17.208', '64.233.173.238']
Run Code Online (Sandbox Code Playgroud)

#第一个案例

tmp1 = [list (map (str, ip.split("."))) for ip in IPlist]

tmp1.sort()
print(tmp1)
Run Code Online (Sandbox Code Playgroud)

当我运行这个片段时。我得到以下输出。

[['209', '85', '238', '4'], ['216', '239', '51', '98'], ['64', '233', '173', '198'], ['64', '233', '173', '238'], ['64', '3', '17', '208']]
Run Code Online (Sandbox Code Playgroud)

#第二种情况

tmp = [tuple (map (int, ip.split("."))) for ip in IPlist]
# print(tmp)

tmp.sort ()
print(tmp)
Run Code Online (Sandbox Code Playgroud)

当我运行第二个案例时,我得到以下输出。

[(64, 3, 17, 208), (64, 233, 173, 198), (64, 233, 173, 238), (209, 85, 238, 4), (216, 239, 51, 98)]
Run Code Online (Sandbox Code Playgroud)

我发现唯一的区别是使用上述函数转换为字符串或 int 函数。但即使初始值是字符串,sort()函数的工作方式不也是一样的吗?

例如:

lst = ['23', '33', '11', '7', '55']
 
# Using sort() function with key as int
lst.sort(key = int)
 
print(lst)
Output: 

['7', '11', '23', '33', '55']
Run Code Online (Sandbox Code Playgroud)

ti7*_*ti7 7

发生这种情况是因为地址被作为字符串进行比较,这些字符串是按词法排序的 - 将它们转换为数字将按照您期望的方式排序

>>> sorted(["11", "2"])
['11', '2']
>>> sorted([11, 2])
[2, 11]
Run Code Online (Sandbox Code Playgroud)

ipaddress但是,总体而言,使用内置模块可能更好,它可以为您正确排序地址,并且具有有用的方法和 IP 地址比较(例如检查 IP 是否是子网的成员或提供接口的网络地址)带有 IP 和掩码)

>>> import ipaddress
>>> ip_list = ['209.85.238.4', '216.239.51.98', '64.233.173.198', '64.3.17.208', '64.233.173.238']
>>> sorted(ipaddress.ip_address(a) for a in ip_list)
[IPv4Address('64.3.17.208'), IPv4Address('64.233.173.198'), IPv4Address('64.233.173.238'), IPv4Address('209.85.238.4'), IPv4Address('216.239.51.98')]
Run Code Online (Sandbox Code Playgroud)