Last active
November 27, 2018 15:58
-
-
Save xyuanmu/7f9530bb08a65d2fc38f to your computer and use it in GitHub Desktop.
使用python对ip地址排序所用代码:http://yuanmu.mzzhost.com/tutorials/python-ip-sort.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
iplist=['192.168.1.33','10.5.1.3','10.5.2.4','202.98.96.68','133.120.1.1','192.168.1.22'] | |
import socket | |
print sorted(iplist, key=socket.inet_aton) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
iplist = ['192.168.1.33','10.5.2.4','10.5.1.3','202.98.96.68','133.120.1.1','192.168.1.22'] | |
print sorted(iplist,key = lambda x: ( int(x.split('.')[0]), int(x.split('.')[1]), int(x.split('.')[2]) )) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
iplist=['192.168.1.33','10.5.1.3','10.5.2.4','202.98.96.68','133.120.1.1','192.168.1.22'] | |
def ip2int(s): | |
l = [int(i) for i in s.split('.')] | |
return (l[0] << 24) | (l[1] << 16) | (l[2] << 8) | l[3] | |
#sort()函数可以传入一个用于比较的函数,这个比较函数接收两个参数,返回需要返回>0, 0, <0的值,因此使用cmp就可以。 | |
iplist.sort(lambda x, y: cmp(ip2int(x), ip2int(y))) | |
print iplist |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# -*- coding: cp936 -*- | |
#Filename:ipsort.py | |
#功能:对形如A.B.C.D的IP地址列表进行排序 | |
'''方法依次按A、B、C、D对列表排序,即先按A的值对列表排序使其分组有序,再对各分组按B排序,划分为更小的分组,以此类推,C、D同样进行,最后整个列表有序。为了提高效率,采用对IP地址列表的索引排序。算法:plist存储IP地址的索引,每个有序的分组用形如'索引值|索引值|...'的字符串表示,每次排序时都将其分割为如上形式的字符串列表,通过4次排序,plist演变为['索引值|','索引值|'...],此时即为已排序状态。IP地址值在[0..255]之间,故在排序时将值相等的划分为一组即可,程序中设置了一个有256个值的relist列表,用于分组。例如:10.10.1.2,10.1.3.2,在按A进行排序时,将其都存入relist[10]。''' | |
iplist=['192.168.1.33','10.5.1.3','10.5.2.4','202.98.96.68','133.120.1.1','192.168.1.22']#待排序的IP地址列表,形如A.B.C.D | |
iplist_sorted=[]#存放排好序的IP地址列表 | |
plist=['']#字符串列表用于索引iplist | |
for i in range(0,len(iplist)):#初始化列表 | |
plist[0]+=(str(i)+'|') | |
def sort(sstr,sortlist): | |
relist=[]#一个有256项的列表,存储基本排序的IP索引 | |
for i in range(0,256):#初始化列表 | |
relist.append('') | |
for index in range(0,len(sortlist)): | |
i=sortlist[index] | |
relist[i]+=(str(index)+'|')#A.B.C.D某项具有相同数值的IP存于同一项 | |
return rep(sstr,relist) | |
def rep(sstr,nlist): | |
'''真难啊,经过sort排序出来的列表结果只是指向被排序部分局部偏移量,还要经过转换,使其存放的是指向 | |
iplist的索引''' | |
tlist=sstr[0:-1].split('|') | |
rtlist=[] | |
for i in range(0,len(nlist)): | |
if nlist[i]<>'': | |
tmplist=nlist[i][0:-1].split('|') | |
tmpstr='' | |
for j in range(0,len(tmplist)): | |
tmpstr+=(tlist[int(tmplist[j])]+'|') | |
rtlist.append(tmpstr) | |
return rtlist | |
for index in range(0,4):#分四次分别处理A.B.C.D,最终使整个列表有序 | |
for i in range(0,len(plist)):#plist为分组有序的列表,在此对各组继续排序 | |
indexlist=((plist[i])[0:-1]).split('|')#indexlist存储待排序的IP的索 | |
sortlist=[]#用数字表示的IP:A.B.C.D某项的列表 | |
for j in range(0,len(indexlist)): | |
iptlist=iplist[int(indexlist[j])].split('.') | |
sortlist.append(int(iptlist[index]))#在四次循环(外层)sortlist分别存入A.B.C.D的值 | |
app=sort(plist[i],sortlist) | |
del plist[i]#对此组数据已进行了排序,删除并插入以排序数据 | |
kc=0 | |
for k in range(0,len(app)): | |
plist.insert(i+k,app[k]) | |
for index in range(0,len(plist)): | |
index_sorted=int(plist[index][0:-1]) | |
iplist_sorted.append(iplist[index_sorted]) | |
print iplist_sorted |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment