在python

时间:2015-08-19 16:25:16

标签: python dictionary levenshtein-distance

我正在进行一些测序分析,并且我试图根据一些标识符创建基因序列的默认字典。所以看下面的例子,我创建了一个dict,并将序列AGAGAGATATAT放在同一个列表中,因为它们具有相同的CCCCCC标识符:

输入:

CCCCCCAGAGAG
CCCCCCATATAT

代码:

from collections import defaultdict
d = defaultdict(list)
d['CCCCCC'].append('AGAGAG')
d['CCCCCC'].append('ATATAT')

我遇到的问题是,如果键序列在levenshtein距离1内,我希望它被视为相同的键。所以如果我遇到一个看起来像这样的序列:

CCCCCTACACAC

我想查看字典,看看有CCCCCC并看到distance('CCCCCC', 'CCCCCT') < 2所以可能会将CCCCCA更改为CCCCCC,然后附加到同一列表中上方。

希望有一个很好的方法来做到这一点。感谢。

2 个答案:

答案 0 :(得分:2)

import numpy
biginput = [''.join([chr(y) for y in numpy.random.randint(65, 90, 6)]) 
            for x in range(100000)]
biginput[0]
'VSNRGF'

我认为你必须以某种方式创建~6种排序,因此对于每个键,你只需进行几次比较。这是可能的,因为Levenshtein只需要考虑几种变化。

事实上,您需要某种形式的LSH(局部敏感哈希)。也许有人可以进一步提供帮助。

答案 1 :(得分:1)

您可以使用difflib.SequenceMatcher为同等序列返回1,您可以使用差异进行比较:

在这种情况下:

>>> import difflib
>>> difflib.SequenceMatcher(None,'CCCCCC', 'CCCCCT').ratio()
0.8333333333333334

演示:

>>> from itertools import combinations
>>> import difflib

>>> li=['AAAAAAACDCBA', 'CCCCCCATATAT', 'CCCCCCAGAGAG', 'CCCCCTACACAC', 'AAAAAAACACAC']
>>> d = defaultdict(list)
>>> for i in li:
...     d[i[:6]].append(i[6:])
... 
>>> keys=d.keys()
>>> for i,j in combinations(keys,2):
...      if difflib.SequenceMatcher(None,i, j).ratio()>0.8:
...         d[i].extend(d[j])
...         del d[j]
... 
>>> d
defaultdict(<type 'list'>, {'AAAAAA': ['ACDCBA', 'ACACAC'], 'CCCCCC': ['ATATAT', 'AGAGAG', 'ACACAC']})
>>>