我正在尝试在 python 中过滤一个大文件中的重叠行。
重叠度设置为两行和其他两行的 25%。换句话说,重叠度是a*b/(c+d-a*b)>0.25
,a
是第 1 行和第 3 行的交点数,是b
第2 行和第 4 行的交c
点数,是第 1 行的元素个数乘以元素个数第 2 行,d
是第 3 行的元素数乘以第 4 行的元素数。如果重叠度大于 0.25,则删除第 3 行和第 4 行。因此,如果我有一个总共有 1000 000 行的大文件,那么前 6 行如下:
c6 c24 c32 c54 c67
k6 k12 k33 k63 k62
c6 c24 c32 c51 c68 c78
k6 k12 k24 k63
c6 c32 c24 c63 c67 c54 c75
k6 k12 k33 k63
由于第 1 两行和第 2 行的重叠度为a=3
, (如c6,c24,c32
), b=3
, (如k6,k12,k63
), c=25,d=24
, a*b/(c+d-a*b)=9/40<0.25
, 故第 3 行和第 4 行不被删除。接下来第一两行和第三两行的重叠度为5*4/(25+28-5*4)=0.61>0.25
,删除第三两行。
最后的答案是第一和第二两行。
c6 c24 c32 c54 c67
k6 k12 k33 k63 k62
c6 c24 c32 c51 c68 c78
k6 k12 k24 k63
伪代码如下:
for i=1:(n-1) # n is a half of the number of rows of the big file for j=(i+1):n if overlap degrees of the ith two rows and jth two rows is more than 0.25 delete the jth two rows from the big file end end end
python代码如下。但它是错误的。如何解决?
with open("iuputfile.txt") as fileobj: sets = [set(line.split()) for line in fileobj] for first_index in range(len(sets) - 4, -2, -2): c=len(sets[first_index])*len(sets[first_index+1]) for second_index in range(len(sets)-2 , first_index, -2): d=len(sets[second_index])*len(sets[second_index+1]) ab = len(sets[first_index] | sets[second_index])*len(sets[first_index+1] | sets[second_index+1]) if (ab/(c+d-ab))>0.25: del sets[second_index] del sets[second_index+1] with open("outputfile.txt", "w") as fileobj: for set_ in sets: # order of the set is undefined, so we need to sort each set output = " ".join(set_) fileobj.write("{0}\n".format(output))
类似的问题可以在https://stackoverflow.com/questions/17321275/中找到
如何修改该代码以在 Python 中解决此问题?谢谢!