我有一个三列的ascii文件,我想根据第三列对文件进行排序和过滤。也就是说,我要从最小到最大排列第三列,并取出上面的所有值,例如8.0。如果直接针对一个列表,我知道该怎么做。但是,我不知道如何将对第三列所做的更改应用于所有列,因为每一行都相互链接。
小问题:我已经这样解压缩了ascii文件:
f=open('textfile.dat',"r")
lines=f.readlines()
result=[]
for x in lines:
result.append(x.split('\n')[0])
a = []
b = []
c = []
for w in result:
ra.append(w.split()[0])
for x in result:
dec.append(x.split()[1])
for y in result:
mag.append(y.split()[2])
p=0
for i in a:
a[p] = float(i)
p= p+1
q=0
for j in b:
b[q] = float(j)
q= q+1
r=0
for k in c:
c[r] = float(k)
r= r+1
test=[a,b,c]
至少可以说这似乎不必要地乏味。有什么办法可以更紧凑地做到这一点?它只是一个具有四列的ascii文件。尽管它们是数字,但它们被读为'str',因此我必须将其改回浮点数。
排序似乎只是在使用转座子,然后根据列进行排序,这解决了我的第一个问题。
tset = zip(*test)
tset.sort(key = lambda x: x[2])
sorttest = zip(*tset)
但是,如果我想摆脱上面第三列中的所有数字,例如8.0,我会做类似的事情:
testrange[2] = [i for i in sorttest[2] if i <= 8.0]
但是,这仅适用于一行。例如,我不能做
testrange[0] = [i*1.0 for i in sorttest[2] if i <= 8.0]
testrange[1] = [i*1.0 for i in sorttest[2] if i <= 8.0]
因此,如何在过滤出某些值的同时对列表列表进行排序?
编辑:
Sample input:
[5,12,3,7,90]
[9,1,63,23,8]
[73,11,8,2,5]
Sample output:
[7,90,3,12]
[23,8,63,1]
[2,5,8,11]
答案 0 :(得分:0)
您可以使用numpy:
import numpy as np
x = [[5,12,3,7,90],
[9,1,63,23,8],
[73,11,8,2,5]]
x = np.array(x)
x = x[:, np.where(x[2] < 70)[0]]
x = x[:, np.argsort(x[2])].tolist()
这将为您提供:
[[7,90,3,12],[23,8,63,1],[2,5,8,11]]
答案 1 :(得分:-1)
因此,我可能没有满足您的要求,但是对于每一行,您都可以列出该行拆分项目的列表。您将得到列表的清单(行)(清单的一行中的单独项目)。然后,您可以按每行的第3列对行进行排序。然后按3s列值过滤该行列表。我已经将这些作为单独的步骤完成,但是您可以将它们合并。
my_data = """1.4 2.5 5.6
2.4 7.5 9.8
4.8 9.7 2.5
4.5 6.5 7.9
1.3 3.4 12.6"""
list_of_data = [line.split() for line in my_data.split("\n")]
sorted_list = sorted(list_of_data, key=lambda line: float(line[2]))
filtered_list = [line for line in sorted_list if float(line[2]) < 8.0]
for line in filtered_list:
print(" ".join(line))
输出
4.8 9.7 2.5
1.4 2.5 5.6
4.5 6.5 7.9
因此,输出已删除了第三列等于或大于8.0的那些行。而且同一行中的所有相关数字也仍在匹配,并以第3列为基础