练习,对IP地址列表排序,请指教

练习,对IP地址列表排序,请指教

一个小程序,对IP地址排序,请大家多提宝贵意见,觉得这里实在是太冷清了,希望大家多点热情


[Copy to clipboard] [ - ]
CODE:
#!/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

谢谢,正在学习,,
希望以后多发这样的小程序让我们新手学习
不知道你是不是要这个效果。

[Copy to clipboard] [ - ]
CODE:
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]
def int2ip(i):
    l = [i >> 24,(i >> 16) & 255,(i >> 8) & 255,i & 255]   
    return '.'.join([str(i) for i in l])
iplist = [ip2int(ip) for ip in iplist]
iplist.sort()
iplist = [int2ip(i) for i in iplist]
print iplist

谢谢楼上,非常巧妙而简单的算法.
可以再简化一下:

[Copy to clipboard] [ - ]
CODE:
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]
   
iplist.sort(lambda x, y: cmp(ip2int(x), ip2int(y)))
print iplist

牛就是牛啊,跟俺果然不是一个级别的。
抛砖引玉,天外有天啊!语无伦次,请谅解.
不过大虾能解释一下iplist.sort(lambda x, y: cmp(ip2int(x), ip2int(y)))
吗?不太明白.
sort()函数可以传入一个用于比较的函数,这个比较函数接收两个参数,返回需要返回>0, 0, <0的值,因此使用cmp就可以。