Skip to main content
 首页 » 编程设计

python之如何在过滤掉某些值的同时对列表列表进行排序

2025年05月04日10hnrainll

我有一个三列的 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”,所以我必须将其改回 float 。

排序好像只是用转置器然后按列排序,这解决了我的第一个问题。

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] 

请您参考如下方法:

你可以使用 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]]