2015-02-24 44 views
4

我对Python非常陌生,并且在做作业时被卡住了。我应该从文件中获取IP地址,然后计算每个IP出现的次数并打印出结果。从文件中获取IP地址并计算出现次数

我不断收到一个错误:Unhashable类型: '名单'

下面是代码:

#!/usr/bin/python 
import re 

def grab_ip(file): 
    ips = [] 
    occurence = {} 
    with open (file) as file: 
     for ip in file: 
      ips.append(re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})', ip)) 
     for ipaddr in ips: 
      if ipaddr in occurence: 
       occurence[ipaddr] = occurence[ipaddr] + 1 
      else: 
       occurence[ipaddr] = 1 
    for key, value in occurence.iteritems(): 
     print key, value 
    return None 
print grab_ip('FILE_WITH_IPS.txt') 

谢谢!

回答

3

re.findall()会返回一个列表,所以尽量用追加花药循环:

#!/usr/bin/python 
import re 

def grab_ip(file): 
    ips = [] 
    occurence = {} 
    with open (file) as file: 
     for ip in file: 
      ip_data=re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})',ip) 
      for i in ip_data: 
       ips.append(i) 
     for ipaddr in ips: 
      if ipaddr in occurence: 
       occurence[ipaddr] = occurence[ipaddr] + 1 
      else: 
       occurence[ipaddr] = 1 
    for key, value in occurence.iteritems(): 
     print key, value 
    return None 
print grab_ip('data') 

这里是文件数据线:

123.0.9.1 
fjdakl 
jfkal 23.2.2.9 

函数返回无

1

你完全在那里。只需使用extend而不是append,因为findall函数的输出必须是一个列表。因此,将列表附加到另一个列表将产生列表列表,这就是为什么你得到了错误Unhashable Type: 'list'

ips.extend(re.findall(r'\b(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\b', ip))