2016-09-14 5 views
0

私はPythonの初心者で、区切り文字なしのリストであるスペースである長いtxtファイルを処理しようとしています。私は最初の列に従ってソートしたいと思う。入力ファイルを最初の列、区切り記号はなくスペースで並べ替えます。

コードは正常にコンパイルされますが、番号の最初の列の最初の値に基づいて出力ファイルがソートされますが、番号自体には依存しません。私もitemgetter演算子を成功させることなく試しました。

私はこれを数時間試してみましたが、誰でも助けてくれることを願っています。なぜ私の行分割機能は私が望む効果がないのですか?

f = open("traj_nvt_20000000.txt","r+") 
lines = f.readlines() for line in f.readlines(): 
line = line.strip() 
parts = line.split(" ") 
lines = sorted(lines, key=lambda line: line[0]) 
with open('test123.txt', 'w') as text: 
    text.writelines(lines) 

私はソートしたいテキストファイルテーブルの抜粋:

54 2 -9.5377 -4.02842 -7.51558 7 
55 2 -9.6834 -4.88656 -7.29358 7 
459 2 -8.76522 -8.30942 -10.144 58 
50 1 -9.33774 -4.46175 -7.24097 7 
56 2 -8.84618 -4.59922 -7.44773 7 
462 2 -10.3377 -9.37008 -10.2265 58 
460 2 -8.59323 -8.64832 -9.32914 58 
457 1 -8.96511 -8.38283 -9.63619 58 
461 2 -9.0727 -7.89321 -9.40869 58 
369 1 -5.93643 -6.20083 -7.56102 47 
504 2 -7.94033 -2.66938 -10.3925 63 
371 2 -6.24752 -6.57434 -7.3023 47 

ヘルプは非常に高く評価されます。

答えて

1

あなたは、数値の英数字ないよう並べ替えるので、(彼らはすべての整数をしている場合、私はわからないんだけど、私はすべてのデータを持っていない)整数またはfloatに、あなたの文字列を変換する必要があります。

lines = sorted(lines, key=lambda line: float(line[0])) 

最初の値が等しい場合、残りの部分は区別するために使用することができますので、浮動小数点数のタプルを返すことによって、すべての値でソートするにも良いだろう。

lines = sorted(lines, key=lambda line: [float(x) for x in line]) 

ところで、あなたのサンプルコードが正しくない(があります読書線の混じった最初のところには&ループがありません。 k)。ここで働く小規模なテストです:

f = open(r"U:\test.txt","r") # sample file in the question 
lines=[] 
for line in f: 
    lines.append(line.strip().split(" ")) 
f.close() 

lines.sort(key=lambda line: [float(x) for x in line]) 
for l in lines: 
    print(",".join(l)) 

結果:あなたは `` `行の行を分割する必要がありますように

50,1,-9.33774,-4.46175,-7.24097,7 
54,2,-9.5377,-4.02842,-7.51558,7 
55,2,-9.6834,-4.88656,-7.29358,7 
56,2,-8.84618,-4.59922,-7.44773,7 
369,1,-5.93643,-6.20083,-7.56102,47 
371,2,-6.24752,-6.57434,-7.3023,47 
457,1,-8.96511,-8.38283,-9.63619,58 
459,2,-8.76522,-8.30942,-10.144,58 
460,2,-8.59323,-8.64832,-9.32914,58 
461,2,-9.0727,-7.89321,-9.40869,58 
462,2,-10.3377,-9.37008,-10.2265,58 
504,2,-7.94033,-2.66938,-10.3925,63 
+0

は思え[0]' ''最初の*の列を参照します*最初の文字よりむしろ。 – wwii

+0

'line [0]'はすでに最初の列です(私の再生器を確認してください、OPコードはちょっと言います...あまりにもファジーなのですが、アイデアはありますが動作しません) –

+0

culpa。 – wwii

関連する問題