在这种情况下如何设置数组索引?

时间:2016-05-10 18:21:16

标签: python indexing

我有这个文件

   0    0  716
   0    1  851
   0    2  900
   1    0  724
   1    1  857
   1    2  903
   2    0  812
   2    1  858
   2    2  902
   3    0  799
   3    1  852
   3    2  905
   4    0  833
   4    1  871
   4    2  907
   5    0  940
   5    1  955
   5    2  995
   6    0  941
   6    1  956
   6    2  996
   7    0  942
   7    1  957
   7    2  999
   8    0  944
   8    1  958
   8    2  992
   9    0  946
   9    1  952
   9    2  998

我想写这样的第三列值

0 0 716
1 0 724
2 0 812
3 0 799
4 0 833
0 1 851
1 1 857
2 1 858
3 1 852
4 1 871
0 2 900
1 2 903
2 2 902
3 2 905
4 2 907
5 0 940
6 0 941
7 0 942
8 0 944
9 0 946
5 1 955
6 1 956
7 1 957
8 1 958
9 1 952
5 2 995
6 2 996
7 2 999
8 2 992
9 2 998

我已阅读文件

l= [line.rstrip('\n') for line in open('test.txt')]

现在我卡住了,如何将其视为3d数组?使用enumerate函数不起作用,因为它自己包含第一个值,我不需要它。

2 个答案:

答案 0 :(得分:2)

这有效:

with open('input.txt') as infile:
    rows = [map(int, line.split()) for line in infile]

def part(minval, maxval):
    return [r for r in rows if minval <= r[0] <= maxval]

with open('output.txt', 'w') as outfile:
    for half in [part(0, 4), part(5, 9)]:
        half.sort(key=lambda (a, b, c): (b, a, c))
        for row in half:
            outfile.write('%s %s %s\n' % tuple(row))

如果您有疑问,请告诉我。

答案 1 :(得分:1)

如果您可以使用pandas模块,那将非常简单:

import pandas as pd
fn = r'D:\temp\.data\37146154.txt'
df = pd.read_csv(fn, delim_whitespace=True, header=None, names=['col1','col2','col3'])

df.sort_values(['col2','col1','col3'])

如果您想将其写回新文件:

df.sort_values(['col2','col1','col3']).to_csv('new_file', sep='\t', index=False, header=None)

测试:

In [15]: df.sort_values(['col2','col1','col3'])
Out[15]:
    col1  col2  col3
0      0     0   716
3      1     0   724
6      2     0   812
9      3     0   799
12     4     0   833
15     5     0   940
18     6     0   941
21     7     0   942
24     8     0   944
27     9     0   946
1      0     1   851
4      1     1   857
7      2     1   858
10     3     1   852
13     4     1   871
16     5     1   955
19     6     1   956
22     7     1   957
25     8     1   958
28     9     1   952
2      0     2   900
5      1     2   903
8      2     2   902
11     3     2   905
14     4     2   907
17     5     2   995
20     6     2   996
23     7     2   999
26     8     2   992
29     9     2   998