2016-05-10 10 views
2

Ich habe diese DateiWie wird der Array-Index in diesem Fall festgelegt?

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 

Ich möchte dritte Spalte Werte schreiben, wie dieses

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 

I Datei

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

Nun, ich bin stecken gelesen haben, wie diese zu lesen, wie 3D-Array? Mit enumerate Funktion, funktioniert nicht, weil es ersten Wert für sich allein enthält, brauche ich das nicht.

+0

Nicht sicher ob ich verstehe. In Ihrer ersten Datei haben Sie einen Index und zwei Werte pro Zeile? Und in Ihrer gewünschten Ausgabe haben Sie einfach eine Reihe von 3D-Arrays? Mit anderen Worten, der Index wurde als dritter Wert für jede Zeile in der Originaldatei eingeklappt? – user6275647

+0

@Jason Nein, nur die dritte Spalte ist entscheidend (sie hat eine physikalische Bedeutung). Die erste und die zweite sollten in der richtigen Reihenfolge sortiert werden, wie meine Beispieldatei angibt. –

+1

Wie ist die Ausgabe geordnet? Keine der Spalten nimmt ständig zu. –

Antwort

2

Dies funktioniert:

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)) 

Lassen Sie mich wissen, wenn Sie Fragen haben.

+0

Genau das, was ich brauche, perfekt! –

+0

Wie können wir einen Code ändern, wenn der dritte Wert in input.txt float ist? –

+0

@RichardRublev Am einfachsten wäre es, 'int' in' float' zu ändern. Es ist nicht wirklich ein Problem, die anderen Zahlen als Floats zu behandeln. –

1

wäre es sehr einfach sein, wenn Sie Pandas Modul verwenden:

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']) 

, wenn Sie es zurück in eine neue Datei schreiben möchten:

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

Test:

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 
Verwandte Themen