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”,因此我必须将其改回浮点数。
排序似乎只是使用转置器然后根据列排序,这解决了我的第一个问题。
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]]
推荐阅读
- html - 在响应式图像的上下文中,HTML 中的“src”是什么?
- python - 无法为其他用户执行授权控制流程 Spotipy
- html - Html/Css 有时无法正确显示/加载,这是在没有任何模式的情况下发生的
- loops - 编写一个代码,该代码将平均一个学生的一组成绩并返回该学生的字母成绩
- macos - 如何在 OS X 中递归删除所有文件和文件夹名称中的所有空格?
- javascript - 使用 for 循环结果作为类名
- scala - Scala 中的通用过滤器函数中的错误
- java - 打开失败:EACCES(权限被拒绝)并尝试在空对象引用上调用虚拟方法“int android.graphics.Bitmap.getWidth()”
- javascript - 从索引为 1 到 5 Javascript 的数组中返回项目
- python - 匹配两个列表字段python的最快方法