- 论坛徽章:
- 0
|
- #!/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
复制代码 |
|