通过包含e值的列正确排序文件内容

时间:2016-07-08 11:07:01

标签: python-2.7 sorting

我想基于e-values列(从最后一列开始)对选项卡分隔文件的内容进行排序,就像在excel中执行一样。我的文件是:

or1|306502419   or1|306502419   100 1175    0   0   1   1175    1   1175    1.10E-18    2381.7  100
or1|306502428   or1|306502428   100 704 0   0   1   704 1   704 1.10E-22    1354    100
or1|306502451   or1|306502451   100 1039    0   0   1   1039    1   1039    1.10E-918   2081.2  100
or1|306502451   or2|315578614   99.1    1039    9   0   1   1039    1   1039    6.70E-296   2065.8  100
or1|306502443   or1|306502443   100 551 0   0   1   551 1   551 6.20E-297   1100.9  100
or1|306502365   or1|306502365   100 620 0   0   1   620 1   620 0   1221.1  100
or1|306502365   or3|315163411   99.7    620 2   0   1   620 1   620 0   1219.1  100
or1|306502371   or3|315163404   100 590 0   0   1   590 1   590 0   1209.5  100
or1|306502371   or1|306502371   100 590 0   0   1   590 1   590 0   1209.5  100
or1|306502380   or1|306502380   100 560 0   0   1   560 1   560 1.10E-10    1113.6  100
or1|306502380   or3|315163395   98.9    560 6   0   1   560 1   560 1.10E-14    1098.2  100

我试过了:

d_list = [line.strip() for line in open("input_file.txt")]
d_list.sort(key = lambda line: line.split("\t")[-3])
for line in d_list:
   print line 

但是排序的电子值是:

0
0
0
0
1.10E-10
1.10E-14
1.10E-18
1.10E-22
1.10E-918
6.70E-296
6.20E-297

但我希望他们成为:

0
0
0
0
1.10E-918
6.20E-297
6.70E-296
1.10E-22
1.10E-18
1.10E-14
1.10E-10

请注意我也尝试了

  

reverse = True

在第2行中标记,但它将低e值向上而不是0。

Plz建议。 谢谢你的考虑

1 个答案:

答案 0 :(得分:1)

您将它们排序为字符串,而不是数字。您需要先将电子值转换为数字。从它的外观来看,float精度对你来说已经不够了(1.10E-918将变为0.0),所以你可以使用Decimal

from decimal import Decimal
d_list.sort(key = lambda line: Decimal(line.split("\t")[-3]))