2013-11-15 38 views
2

我想找到一個字符串上最頻繁的子字符串(一定長度L),但允許一定的閾值或錯誤T(在子字符串的位置),顯然不會長於L本身。但是,迄今爲止我還沒有取得任何成就。我怎樣才能完成代碼?容忍最頻繁的子字符串

stn='KLHLHLHKPLHLHLPHHKLH' 
L = 4 #(lenght of the pattern) 
T = 1 #(maximum tolerance or permitted error in any position of the query pattern) 

pattcount = {} 
for n in range(len(stn)- L+1): 
patt = stn[n:n+L] 
s_ = stn[i:i+len(patt)] 
if LevenshteinDistance(s_, patt) == T: 
pattcount[patt] = pattcount[patt] + 1 if pattcount.has_key(patt) else 1 

max = 0 
max_patt = [] 
for p,v in pattcount.iteritems(): 
if v > max: 
max_patt = [p] 
max = v 
elif v == max: 
max_patt += [p] 
print (" ".join(max_patt)) 

因此,例如,如果最頻繁的是KLH,如何能HLH,PLH,KLP,KPH的頻率膨脹KLH的頻率(以報告)?

回答

0
>>> from Levenshtein import distance 
>>> from collections import defaultdict 
>>> tups = [stn[i:i+L] for i in range(0, len(stn) - (L - 1))] 
>>> print tups 
['KLHL', 'LHLH', 'HLHL', 'LHLH', 'HLHK', 'LHKP', 'HKPL', 'KPLH', 'PLHL', 'LHLH', 
'HLHL', 'LHLP', 'HLPH', 'LPHH', 'PHHK', 'HHKL', 'HKLH'] 
>>> d = defaultdict(list) 
>>> [d[x].append(y) for x in tups for y in tups 
            if x is not y and distance(x, y) <= T] 
>>> print d 
defaultdict(<type 'list'>, { 
       'KLHL': ['HLHL', 'PLHL', 'HLHL'], 
       'LHLP': ['LHLH', 'LHLH', 'LHKP', 'LHLH'], 
       'HLHK': ['HLHL', 'HLHL'], 
       'HLHL': ['KLHL', 'HLHK', 'PLHL', 'KLHL', 'HLHK', 'PLHL'], 
       'LHKP': ['LHLP'], 
       'LHLH': ['LHLP', 'LHLP', 'LHLP'], 
       'PLHL': ['KLHL', 'HLHL', 'HLHL']}) 
>>> s = sorted(d.iterkeys(), key=lambda k: len(d[k]), reverse=True) 
>>> print s 
['HLHL', 'LHLP', 'KLHL', 'LHLH', 'PLHL', 'HLHK', 'LHKP'] 
+0

感謝您的幫助。但是,在您向我發送的代碼之前輸入以下代碼後,我沒有成功:line ='KLHLHLHKPLHLHLPHHKLH' L = 4 tups = {} 我在做什麼錯? (第一個打印(tups)爲空) –

+0

http://ideone.com/EyBCC8 –

+0

好的,謝謝,現在腳本在'for x'部分顯示錯誤(無效語法)。它可能與使用的Python版本有關嗎? (2.7.3) –

相關問題