ip = {} # key为ip信息,value为ip数量(若重复则只增加数量)
with open("/home/shinetech/llj/test/access.log",mode="rt",encoding="utf-8") as rt:
for line in rt:
ip_key=line.split()[0] #截取字符串ip列
if ip_key in ip.keys(): #ip列在字典key中则value数量加1
ip[ip_key]=ip[ip_key]+1
print("ip key",ip_key,"ip value",ip[ip_key]+1)
else:#ip列不在字典key中则value数量是1
ip[ip_key]=1
#保存为字典后,按字典的value值大小排序,这个才是本题的难点,由于dict是无序的
"""
首先介绍sorted函数,sorted(iterable,key,reverse),sorted一共有iterable,key,reverse这三个参数。
其中iterable表示可以迭代的对象,例如可以是dict.items()、dict.keys()等,key是一个函数,key是一个函数,用来选取参与比较的元素,reverse则是用来指定排序是倒序还是顺序,reverse=true则是倒序(从大到小),reverse=false则是顺序(从小到大),默认是reverse=false
"""
#(1)key使用lambda匿名函数取value进行排序
#res=sorted(ip,key=lambda k:ip[k],reverse=True)
#print(res)
#['212.64.105.249', '212.129.144.85', '44.234.64.24', '168.90.89.105', '177.105.133.133', '193.118.53.194', '222.90.82.164']
res=sorted(ip.items(),key=lambda x:x[1],reverse=True)#使用元祖的第1下标,作为比较的元素。ip.items() 只有一个x变量接受ip.itens()返回值以元祖的形式显示字典的key,values
print(res)
[('212.64.105.249', 10), ('212.129.144.85', 5), ('44.234.64.24', 1), ('168.90.89.105', 1), ('177.105.133.133', 1), ('193.118.53.194', 1), ('222.90.82.164', 1)]