2013-07-29 63 views
0

沒有你的幫助,我無法讓它工作。我想過濾一些基於設備名稱的系統日誌消息。輸出應該看起來像這樣。count in defaultdict(list)python

Device1: 1x failure1,50 x failure2, 20x failure3 
Device3: 10 x failure1,5 x failure2, 2x failure3 

代碼:

frequencies = defaultdict(list) 

word = ['syslog1error1','syslog1error2','syslog1error3'] 

def findpattern(): 
    for line in syslog: 
      if re.search(r"regexforhostname",line): 
       hostname= line.strip()[16:27] 
       for failure in word: 
        if failure in line:  
        frequencies[hostname].append(failure) 

x = findpattern() 

print frequencies 

輸出看起來像

'Devicename':'syslog1error1', 'syslog1error1', 'syslog1error2', 'syslog1error3' 

我想算在列表中的重複輸入。但我不能得到它與進口收集(計數器)運行

請幫助。

+2

*但我不能把它與進口集運行(計數器)*會發生什麼,當你試圖導入'集合。計數器,確切地說? –

+0

你在Python 2.7以下的東西嗎? –

+0

[Counter in Collections module Python](http://stackoverflow.com/q/13311094)可能存在重複,具體取決於您的錯誤。 –

回答

2

使用collections.Counter()(見Counter in Collections module Python如果你是一個Python版本< 2.7):

from collections import Counter, defaultdict 

def findpattern(): 
    frequencies = defaultdict(Counter) 

    for line in syslog: 
     if re.search(r"regexforhostname",line): 
      hostname= line.strip()[16:27] 
      frequencies[hostname].update(f for f in word if f in line) 

    return frequencies 

result = findpattern() 
for device, frequencies in result.iteritems(): 
    print '{}: {}'.format(
     device, 
     ', '.join(['{}x {}'.format(c, f) for f, c in frequencies.most_common()])) 
+0

錯字 - 'collections.Counter()'。 :) –

+0

+1計數器和重構返回字典。我會把頻率的初始化放入findpattern。 – Nicolas78

+0

@SukritKalra:是的,從Plone緩緩;我也爲'集體'錯誤地收集'集合'。感謝您指出,修正! –