如何在筛选某些值的同时对列表进行排序?

2024-10-02 08:18:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个三列的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,所以我必须把它改回floats。你知道吗

排序似乎只是使用转置器,然后根据列进行排序,这解决了我的第一个问题。你知道吗

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]

Tags: 文件in列表forif排序asciiresult
2条回答

所以,我可能错过了你的要求,但对于每一行,你可以从该行的项目列表分割。您将以列表的列表(行)结束(行中的分隔项)。然后可以按每行的第3列对行进行排序。然后按列值过滤(行)列表。我已经做了这些单独的步骤,但你可以合并它们。你知道吗

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

因此,th输出删除了第3列为8.0或更高的行。同一行中的所有相关数字也仍然匹配,并且按照第3列的顺序排列

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

相关问题 更多 >

    热门问题