免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 11039 | 回复: 20
打印 上一主题 下一主题

练习,对IP地址列表排序,请指教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-06 10:37 |只看该作者 |倒序浏览
一个小程序,对IP地址排序,请大家多提宝贵意见,觉得这里实在是太冷清了,希望大家多点热情

论坛徽章:
0
2 [报告]
发表于 2006-09-06 10:38 |只看该作者

  1. #!/usr/bin/python
  2. # -*- coding: cp936 -*-
  3. #Filename:ipsort.py
  4. #功能:对形如A.B.C.D的IP地址列表进行排序
  5. '''方法依次按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]。'''


  6. 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
  7. iplist_sorted=[]#存放排好序的IP地址列表
  8. plist=['']#字符串列表用于索引iplist

  9. for i in range(0,len(iplist)):#初始化列表
  10.     plist[0]+=(str(i)+'|')

  11. def sort(sstr,sortlist):
  12.    
  13.     relist=[]#一个有256项的列表,存储基本排序的IP索引
  14.     for i in range(0,256):#初始化列表
  15.         relist.append('')
  16.     for index in range(0,len(sortlist)):
  17.         i=sortlist[index]
  18.         relist[i]+=(str(index)+'|')#A.B.C.D某项具有相同数值的IP存于同一项
  19.     return rep(sstr,relist)

  20. def rep(sstr,nlist):

  21.    '''真难啊,经过sort排序出来的列表结果只是指向被排序部分局部偏移量,还要经过转换,使其存放的是指向
  22.    iplist的索引'''
  23.    
  24.    tlist=sstr[0:-1].split('|')
  25.    rtlist=[]
  26.    for i in range(0,len(nlist)):
  27.       if nlist[i]<>'':
  28.          tmplist=nlist[i][0:-1].split('|')
  29.          tmpstr=''
  30.          for j in range(0,len(tmplist)):
  31.             tmpstr+=(tlist[int(tmplist[j])]+'|')
  32.          rtlist.append(tmpstr)
  33.    return rtlist

  34. for index in range(0,4):#分四次分别处理A.B.C.D,最终使整个列表有序
  35.    
  36.   for i in range(0,len(plist)):#plist为分组有序的列表,在此对各组继续排序
  37.     indexlist=((plist[i])[0:-1]).split('|')#indexlist存储待排序的IP的索
  38.      
  39.     sortlist=[]#用数字表示的IP:A.B.C.D某项的列表
  40.     for j in range(0,len(indexlist)):
  41.         iptlist=iplist[int(indexlist[j])].split('.')
  42.         sortlist.append(int(iptlist[index]))#在四次循环(外层)sortlist分别存入A.B.C.D的值           
  43.    
  44.     app=sort(plist[i],sortlist)
  45.     del plist[i]#对此组数据已进行了排序,删除并插入以排序数据
  46.     kc=0
  47.     for k in range(0,len(app)):
  48.        plist.insert(i+k,app[k])
  49. for index in range(0,len(plist)):

  50.     index_sorted=int(plist[index][0:-1])
  51.     iplist_sorted.append(iplist[index_sorted])
  52. print iplist_sorted
复制代码

论坛徽章:
0
3 [报告]
发表于 2006-09-06 15:39 |只看该作者
谢谢,正在学习,,
希望以后多发这样的小程序让我们新手学习
3751 该用户已被删除
4 [报告]
发表于 2006-09-06 15:43 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2006-09-06 20:11 |只看该作者
谢谢楼上,非常巧妙而简单的算法.

论坛徽章:
0
6 [报告]
发表于 2006-09-06 21:31 |只看该作者
可以再简化一下:


  1. 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']
  2. def ip2int(s):
  3.     l = [int(i) for i in s.split('.')]
  4.     return (l[0] << 24) | (l[1] << 16) | (l[2] << 8) | l[3]
  5.    
  6. iplist.sort(lambda x, y: cmp(ip2int(x), ip2int(y)))
  7. print iplist
复制代码
3751 该用户已被删除
7 [报告]
发表于 2006-09-06 22:40 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2006-09-06 23:47 |只看该作者
抛砖引玉,天外有天啊!语无伦次,请谅解.

论坛徽章:
0
9 [报告]
发表于 2006-09-07 00:12 |只看该作者
不过大虾能解释一下iplist.sort(lambda x, y: cmp(ip2int(x), ip2int(y)))
吗?不太明白.

论坛徽章:
0
10 [报告]
发表于 2006-09-07 00:31 |只看该作者
sort()函数可以传入一个用于比较的函数,这个比较函数接收两个参数,返回需要返回>0, 0, <0的值,因此使用cmp就可以。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP