这里有一点脑力障碍(至少对我来说)。我使用一个简单的Python脚本返回一个" up"使用fping的主机。我存储了每个" up"主机在Python列表中,但list.sort()显然不会根据存储为字符串的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
答案 0 :(得分:2)
对于最后一个八位字节,您可以在密钥中使用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']
哪个是下降 - 但你的例子似乎在提升:
>>> sorted(addr_list, key=lambda x: int(x.rsplit('.', 1)[1]))
['127.0.0.1', '192.168.0.1', '1.2.3.4', '10.11.12.13']
但是我认为我更喜欢按照@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']
答案 1 :(得分:1)
假设您的addr_list
列表看起来像这样(您还没有在问题中指明它):
addr_list = [
'10.11.12.13',
'1.2.3.4',
'127.0.0.1',
'192.168.0.1',
]
在.
上拆分并使用最后一项(最后一个八位字节)作为排序的关键。当然,对于' 127.0.0.1' vs' 192.168.0.1'然后你可能想要对第二个最后一个八位字节进行排序,然后是第三个最后一个八位字节,然后是第一个八位字节。
因此将此行为用作key
:
>>> list(reversed('10.11.12.13'.split('.')))
['13', '12', '11', '10']
>>> sorted(addr_list, key=lambda ip: list(reversed(ip.split('.'))))
['127.0.0.1', '192.168.0.1', '10.11.12.13', '1.2.3.4']
请注意,13
之前已列出4
。因此,还要确保将每个项目作为数字而不是字符串进行比较:
>>> 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']
答案 2 :(得分:1)
sort
可以将函数用作执行比较的参数。如果第一个参数被认为是更大,则该函数返回两个输入1
,如果第二个参数更大,则返回-1
,如果它们等于排序目的,则0
。以下是针对您案例的功能:
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
然后,您只需将其作为关键字参数提供给sort:
>>> ips = ['192.168.1.101', '251.39.0.103', '127.0.0.1']
>>> ips.sort(cmp = compare_ips)
>>> ips
['127.0.0.1', '192.168.1.101', '251.39.0.103']
答案 3 :(得分:1)
仅按最后一个八位字节进行排序是一个非常奇怪的要求,因为较高的八位字节通常会告诉您有关地址的更多信息(例如,可公共路由地址的国家/地区,较小网络的子网)。
更一般地说,这将按照数字表示对IP地址列表进行排序:
import socket
ip_list = ['192.168.1.120', '192.168.1.30', '127.0.0.1']
# numeric sort, leveraging inet_pton to convert valid IPv4 address
# notation to a 'packed' string of 4 bytes, which will then sort correctly.
print sorted(ip_list, key=lambda (x): socket.inet_pton(socket.AF_INET, x))
# strict string-based sort for comparison
print sorted(ip_list)
或者如果您不想将套接字模块用于inet_pton:
def ip2int(ipstr):
octets = [int(x) for x in ipstr.split('.')]
return sum( (o << (8 * 3-i) for i,o in enumerate(octets)) )
sorted(ip_list, key=ip2int)
答案 4 :(得分:1)
addr_list = [
'10.11.12.3',
'1.2.3.4',
'127.0.0.1',
'192.168.0.2',
]
# lambda x=192.168.0.2 , ip.split= ['192','168','0','2'][-1] = 2
sorted_ips = sorted(addr_list , key=lambda ip: ip.split('.')[-1])
for ip in sorted_ips:
print(ip)