Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在过滤掉某些值的同时对列表列表进行排序?_Python_List Comprehension - Fatal编程技术网

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

Python 如何在过滤掉某些值的同时对列表列表进行排序?,python,list-comprehension,Python,List Comprehension,我有一个三列的ascii文件,我想根据第三列对文件进行排序和筛选。也就是说,我想将第三列从最小到最大排列,并取出上面的所有值,比如8.0。如果直接针对一个列表,我知道如何做这两件事。但是,我不知道如何将我对第三列所做的更改应用于所有列,因为每一行都是相互链接的 小问题:我已将ascii文件解包为: f=open('textfile.dat',"r") lines=f.readlines() result=[] for x in lines: result.append(x.split('

我有一个三列的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]

所以,我可能错过了您的要求,但对于每一行,您可以从该行分割出一个项目列表。最后,您将看到一行的listlines和ListSeparated项。然后可以按每行的第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))

因此,th输出已删除第3列为8.0或更大的行。同一行中的所有相关编号也仍然匹配,并且顺序基于第三列,因此我可能没有满足您的要求,但对于每一行,您可以列出该行拆分的项目列表。最后,您将看到一行的listlines和ListSeparated项。然后可以按每行的第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))
因此,th输出已删除第3列为8.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]]

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


你能给出一个示例输入和示例输出吗?我想先删除不需要的数据行,然后对其余的行进行排序,而不是一次完成所有操作,会简单得多。你能给出一个示例输入和示例输出吗?我想先删除不需要的数据行,然后对其余的行进行排序,会简单得多,我没有试图一次完成所有的工作,而是尝试了上面的代码和np.where函数。但是,np.argsort在这种情况下不起作用。事实上,它只输出列表中的第一个数字。Aka,在这种情况下,它输出[[7]、[23]、[2]],与您提到的输出相反。相反,我使用了上面提到的排序方法test.sortkey=lambda x:x[2]进行排序,这很有效!我以为它是在列表中输出的,而不是在数组中。我不知道为什么它对你不起作用。当我运行这段代码时,argsort返回[2 3 1 0],这是您希望对矩阵按列排序的方式。删除第一列后,矩阵中的第二行是11,8,2,5,因此使用argsort作为索引,您将得到2,5,8,11。我尝试了上面的代码和np.where函数,这非常有帮助。但是,np.argsort在这种情况下不起作用。事实上,它只输出列表中的第一个数字。Aka,在这种情况下,它输出[[7]、[23]、[2]],与您提到的输出相反。相反,我使用了上面提到的排序方法test.sortkey=lambda x:x[2]进行排序,这很有效!我以为它是在列表中输出的,而不是在数组中。我不知道为什么它对你不起作用。当我运行这段代码时,argsort返回[2 3 1 0],这是您希望对矩阵按列排序的方式。删除第一列后,矩阵中的第二行是11,8,2,5,因此使用argsort作为索引,可以得到2,5,8,11。
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()