我想基于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建议。 谢谢你的考虑
答案 0 :(得分:1)
您将它们排序为字符串,而不是数字。您需要先将电子值转换为数字。从它的外观来看,float
精度对你来说已经不够了(1.10E-918将变为0.0),所以你可以使用Decimal
:
from decimal import Decimal
d_list.sort(key = lambda line: Decimal(line.split("\t")[-3]))