回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个三列的ascii文件,我想根据第三列对文件进行排序和过滤。也就是说,我想将第三列从最小到最大排列,并取出上面的所有值,比如8.0。如果直接针对一个列表,我知道如何做到这两件事。但是,我不知道如何将我对第三列所做的更改应用于所有列,因为每一行都是相互链接的。你知道吗</p>
<p>小问题:我已将ascii文件解包为:</p>
<pre><code>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]
</code></pre>
<p>至少可以说,这是不必要的乏味。有什么方法可以更紧凑地完成这项工作吗?它只是一个包含四列的ascii文件。虽然它们是数字,但是它们被读作str,所以我必须把它改回floats。你知道吗</p>
<p>排序似乎只是使用转置器,然后根据列进行排序,这解决了我的第一个问题。你知道吗</p>
<pre><code>tset = zip(*test)
tset.sort(key = lambda x: x[2])
sorttest = zip(*tset)
</code></pre>
<p>但是,如果我想去掉上面第三列中的所有数字,比如8.0,我会这样做:</p>
<pre><code>testrange[2] = [i for i in sorttest[2] if i <= 8.0]
</code></pre>
<p>但是,这只适用于一行。比如说,我不能做</p>
<pre><code>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]
</code></pre>
<p>因此,如何在筛选某些值的同时对列表列表进行排序?你知道吗</p>
<p>编辑:</p>
<pre><code>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]
</code></pre>