我想解决一个我一直在Python中遇到的问题。我有一个文件,有一列,其中包含大约6000行。对于每一行,每一项都是唯一的(这个文件被过滤以从40000行文件中删除重复项)。每行中的项目长度不同,其中一些项目的长度与其他项目相等。在
单线示例:
IGHV3-30/33rn-IGHJ4-CARDPSLSSMITFGGVIVTRGYFDYW
或更多例子,在第三个“-”后用制表符隔开(第一部分不同):
^{pr2}$在第一列中,有些项目是不同的。在第二列中,每一项都是唯一的。第一列项目需要匹配,然后第二列项目需要按最小不匹配值2排序。 理想情况下,这对Levenshtein模块很好,因为我可以设置max,但我需要两个字符串。有没有一种方法可以在一个列表中的每一项上使用Levenshtein?在
我需要做的是打开这个文件(我想先按长度排序可能会有帮助,但是我不确定)。在所有的项都按长度分组后,我需要将这些项按1个字符进行分组(第三个“-”之前的字符串必须相同,其中“-”后面的字符串只应相差1个字符)
我想我遇到的问题是生成一个适当的for循环来遍历条目长度。在
到目前为止,我的代码是:
import sys
import os
import Levenshtein
inp = sys.argv[1] # Input file containing single column of items
with open(inp, "r") as f1:
vj = [line.strip() for line in f1]
lengths = []
for k in vj:
i = len(k)
lengths.append(i)
lengths_sort = sorted(lengths, reverse = True)
uniq_len = []
for i in lengths_sort:
if i not in uniq_len:
uniq_len.append(i)
print uniq_len #For QC purposes
def get_new_list(strings, counts, outlist=[]):
for s in strings:
if len(s) == counts[0]:
outlist.append(s)
return outlist
new_vj = get_new_list(vj, uniq_len, outlist=[])
print new_vj
ham = Levenshtein.hamming(new_vj[0], new_vj[1])
print ham
所以我想要的输出是好的,但还没有完成:
[46, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18]
46
['IGHV3-30/33rn-IGHJ4-CAKDPSLSSMITFGGVIVTRGYFDYW', 'IGHV3-30/33rn-IGHJ4-CARDPSLSSMITFGGVIVTRGYFDYW']
1
有两个长度为46的项目(巧合的是,第三个“-”之前的字符串是相同的;很好)并且它们在两个字符串之间只相差一个字符。在
我的问题是,1。我如何迭代uniq_len列表中的数字作为unput在“strings”列表中匹配长度(参见代码中的函数)。2我想为每个不同的长度创建一个新列表。三。如果每个新列表中都有多个项目,则所有项目的差别仅为1个字符。在
注意:“-”是使用UNIX paste-d-命令创建的,其中3个文件每个文件包含1个列来创建这个文件。是否可以更容易地将这些文件与\t作为分隔符粘贴在一起以创建3列?在
所以,打开文件,去掉行,然后就可以匹配第1列、第2列,看看第3列是否有一个或多个字符不同?在
感谢所有的帮助。在
更新:修改为处理可变数量的“id”子字段,并将结果打印为单个字符串。注:几个测试用例被添加到输入的末尾,使一些测试用例具有不同数量的前导字段组成id(即2个而不是3个)。在
我还重命名了
num_mismatches()
函数hamming_distance()
,因为它就是这样。在使用以下输入:
这个剧本:
^{pr2}$输出:
希望这次更新也有帮助。。。在
假设您想按A)列的长度,B)该列的Levenshtein距离和上面或下面的列对一些行进行排序。在
这个问题马上就出现了levenshtein距离是在两个相对的对象之间;也就是说,
Levenshtein(a, b)
不是像len(a)
这样的单声道属性。levenshtein距离的值会随着列表中各行相对位置的变化而变化。在python2.X支持较早的
cmp
和key
参数进行排序。这是低效的,因为每次通过分拣都必须重新评估。但是,Levenshtein sort是相对于条目上方和下方的项。在作为一个例子,让我们制作一个示例数据的矩阵:
现在按
^{pr2}$row[1]
的长度对这些行进行排序:现在根据条目的levenshtein距离进行排序。请注意,您需要使用
cmp
,因为levenstein基于两个值:如果要将两元素排序
cmp
更改为键类型(对于不支持cmp的Python 3),可以生成比较对象:使用
data.sort(key=cmp_to_key(levenshtein))
调用排序相关问题 更多 >
编程相关推荐