2015-02-24 47 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))