Skip to content

Instantly share code, notes, and snippets.

@xyuanmu
Last active November 27, 2018 15:58
Show Gist options
  • Save xyuanmu/7f9530bb08a65d2fc38f to your computer and use it in GitHub Desktop.
Save xyuanmu/7f9530bb08a65d2fc38f to your computer and use it in GitHub Desktop.
使用python对ip地址排序所用代码:http://yuanmu.mzzhost.com/tutorials/python-ip-sort.html
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)
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]) ))
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
#!/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