如何根据端口号对IP地址进行排序?
How to sort IP addresses with port number?
我正在创建自己的报告工具,我正在尝试弄清楚如何使用端口号对 IP 地址进行排序。
如何使用端口号对 IP 地址进行排序,以便首先对 IP 地址进行排序,然后再通过端口号进行排序。我能够很好地对 IP 地址进行排序,但是当结合端口号时,就变得困难了。
a = ['192.168.0.3 (443/tcp)|', '192.168.0.176 (443/tcp)|', '192.168.0.40 (443/tcp)|', '192.168.0.15 (8443/tcp)|', '192.168.0.16 (8443/tcp)|', '192.168.0.12 (443/tcp)|', '192.168.0.9 (3389/tcp)|', '192.168.0.15 (443/tcp)|', '192.168.0.16 (443/tcp)|', '192.168.0.3 (3389/tcp)|', '192.168.0.14 (443/tcp)|']
print(a.sort(key=lambda s: map(int, s.split('.')))) #this works fine with just IP address not with the current format of (xxx/tcp). The pipe is for delimiters so please ignore.
我想先按 IP 地址排序输出,然后对每个 IP 按端口号排序。因此,例如,前几个结果将是:
a= ['192.168.0.3 (443/tcp)|', '192.168.0.3 (3389/tcp)|', 192.168.0.9 (3389/tcp)|, ...']
使用 re.findall
:
import re
def get_ip_port(x):
*ips, port = map(int, re.findall('\d+', x))
return ips, port
sorted(a, key=get_ip_port)
输出:
['192.168.0.3 (443/tcp)|',
'192.168.0.3 (3389/tcp)|',
'192.168.0.9 (3389/tcp)|',
'192.168.0.12 (443/tcp)|',
'192.168.0.14 (443/tcp)|',
'192.168.0.15 (443/tcp)|',
'192.168.0.15 (8443/tcp)|',
'192.168.0.16 (443/tcp)|',
'192.168.0.16 (8443/tcp)|',
'192.168.0.40 (443/tcp)|',
'192.168.0.176 (443/tcp)|']
解释:
map(int, re.findall('\d+', x))
: 求出所有数字并使它们成为int
*ips, port
:解压上述 int
s 并重新打包成除了最后一个 (*ips
) 和最后一个 (port
)
sorted(a, key=get_ip_port)
:作为get_ip_port
returns两个键(ips
,port
),sorted
排序a
首先 ips
,然后 port
,随心所欲。
您可以使用多个条件进行排序(map(int,e[0].split('.'))
作为条件 1,int(e[1].lstrip('(').split('/')[0])
作为条件 2),如下所示,
>>> a
['192.168.0.3 (443/tcp)|',
'192.168.0.176 (443/tcp)|',
'192.168.0.40 (443/tcp)|',
'192.168.0.15 (8443/tcp)|',
'192.168.0.16 (8443/tcp)|',
'192.168.0.12 (443/tcp)|',
'192.168.0.9 (3389/tcp)|',
'192.168.0.15 (443/tcp)|',
'192.168.0.16 (443/tcp)|',
'192.168.0.3 (3389/tcp)|',
'192.168.0.14 (443/tcp)|']
>>> [i.split() for i in a]
[['192.168.0.3', '(443/tcp)|'],
['192.168.0.176', '(443/tcp)|'],
['192.168.0.40', '(443/tcp)|'],
['192.168.0.15', '(8443/tcp)|'],
['192.168.0.16', '(8443/tcp)|'],
['192.168.0.12', '(443/tcp)|'],
['192.168.0.9', '(3389/tcp)|'],
['192.168.0.15', '(443/tcp)|'],
['192.168.0.16', '(443/tcp)|'],
['192.168.0.3', '(3389/tcp)|'],
['192.168.0.14', '(443/tcp)|']]
>>> sorted([i.split() for i in a],key=lambda e: (map(int,e[0].split('.')),int(e[1].strip('(').split('/')[0])))
[['192.168.0.3', '(443/tcp)|'],
['192.168.0.3', '(3389/tcp)|'],
['192.168.0.9', '(3389/tcp)|'],
['192.168.0.12', '(443/tcp)|'],
['192.168.0.14', '(443/tcp)|'],
['192.168.0.15', '(443/tcp)|'],
['192.168.0.15', '(8443/tcp)|'],
['192.168.0.16', '(443/tcp)|'],
['192.168.0.16', '(8443/tcp)|'],
['192.168.0.40', '(443/tcp)|'],
['192.168.0.176', '(443/tcp)|']]
您可以使用 sorted
在一行中完成,如下所示:
sorted(a, key=lambda x:x.split(' ')[0])
我正在创建自己的报告工具,我正在尝试弄清楚如何使用端口号对 IP 地址进行排序。
如何使用端口号对 IP 地址进行排序,以便首先对 IP 地址进行排序,然后再通过端口号进行排序。我能够很好地对 IP 地址进行排序,但是当结合端口号时,就变得困难了。
a = ['192.168.0.3 (443/tcp)|', '192.168.0.176 (443/tcp)|', '192.168.0.40 (443/tcp)|', '192.168.0.15 (8443/tcp)|', '192.168.0.16 (8443/tcp)|', '192.168.0.12 (443/tcp)|', '192.168.0.9 (3389/tcp)|', '192.168.0.15 (443/tcp)|', '192.168.0.16 (443/tcp)|', '192.168.0.3 (3389/tcp)|', '192.168.0.14 (443/tcp)|']
print(a.sort(key=lambda s: map(int, s.split('.')))) #this works fine with just IP address not with the current format of (xxx/tcp). The pipe is for delimiters so please ignore.
我想先按 IP 地址排序输出,然后对每个 IP 按端口号排序。因此,例如,前几个结果将是:
a= ['192.168.0.3 (443/tcp)|', '192.168.0.3 (3389/tcp)|', 192.168.0.9 (3389/tcp)|, ...']
使用 re.findall
:
import re
def get_ip_port(x):
*ips, port = map(int, re.findall('\d+', x))
return ips, port
sorted(a, key=get_ip_port)
输出:
['192.168.0.3 (443/tcp)|',
'192.168.0.3 (3389/tcp)|',
'192.168.0.9 (3389/tcp)|',
'192.168.0.12 (443/tcp)|',
'192.168.0.14 (443/tcp)|',
'192.168.0.15 (443/tcp)|',
'192.168.0.15 (8443/tcp)|',
'192.168.0.16 (443/tcp)|',
'192.168.0.16 (8443/tcp)|',
'192.168.0.40 (443/tcp)|',
'192.168.0.176 (443/tcp)|']
解释:
map(int, re.findall('\d+', x))
: 求出所有数字并使它们成为int
*ips, port
:解压上述int
s 并重新打包成除了最后一个 (*ips
) 和最后一个 (port
)sorted(a, key=get_ip_port)
:作为get_ip_port
returns两个键(ips
,port
),sorted
排序a
首先ips
,然后port
,随心所欲。
您可以使用多个条件进行排序(map(int,e[0].split('.'))
作为条件 1,int(e[1].lstrip('(').split('/')[0])
作为条件 2),如下所示,
>>> a
['192.168.0.3 (443/tcp)|',
'192.168.0.176 (443/tcp)|',
'192.168.0.40 (443/tcp)|',
'192.168.0.15 (8443/tcp)|',
'192.168.0.16 (8443/tcp)|',
'192.168.0.12 (443/tcp)|',
'192.168.0.9 (3389/tcp)|',
'192.168.0.15 (443/tcp)|',
'192.168.0.16 (443/tcp)|',
'192.168.0.3 (3389/tcp)|',
'192.168.0.14 (443/tcp)|']
>>> [i.split() for i in a]
[['192.168.0.3', '(443/tcp)|'],
['192.168.0.176', '(443/tcp)|'],
['192.168.0.40', '(443/tcp)|'],
['192.168.0.15', '(8443/tcp)|'],
['192.168.0.16', '(8443/tcp)|'],
['192.168.0.12', '(443/tcp)|'],
['192.168.0.9', '(3389/tcp)|'],
['192.168.0.15', '(443/tcp)|'],
['192.168.0.16', '(443/tcp)|'],
['192.168.0.3', '(3389/tcp)|'],
['192.168.0.14', '(443/tcp)|']]
>>> sorted([i.split() for i in a],key=lambda e: (map(int,e[0].split('.')),int(e[1].strip('(').split('/')[0])))
[['192.168.0.3', '(443/tcp)|'],
['192.168.0.3', '(3389/tcp)|'],
['192.168.0.9', '(3389/tcp)|'],
['192.168.0.12', '(443/tcp)|'],
['192.168.0.14', '(443/tcp)|'],
['192.168.0.15', '(443/tcp)|'],
['192.168.0.15', '(8443/tcp)|'],
['192.168.0.16', '(443/tcp)|'],
['192.168.0.16', '(8443/tcp)|'],
['192.168.0.40', '(443/tcp)|'],
['192.168.0.176', '(443/tcp)|']]
您可以使用 sorted
在一行中完成,如下所示:
sorted(a, key=lambda x:x.split(' ')[0])