2016-04-26 10 views
3

私は6000の数値を持つ2つのファイルを持っています。私は両方の最初の15の値を与えています。数値辞書のリストを並べ替えるにはどうすればいいですか?

base.txt 
2.900000e+03 
2.900000e+03 
2.900000e+03 
2.900000e+03 
2.900000e+03 
2.900000e+03 
2.900000e+03 
2.900000e+03 
2.900000e+03 
2.900000e+03 
2.900000e+03 
2.900000e+03 
2.900000e+03 
2.900000e+03 
2.900000e+03 

new2.txt

0 
    100 
    200 
    1 
    101 
    201 
    2 
    102 
    202 
    3 
    103 
    203 
    4 
    104 
    204 

は、私は2番目のファイルの昇順に対応するbase.txt値(速度)から新しいリストを作成したい。(0,1,2、 3,4,5、...) 私のコードは、これまで

import itertools 
from operator import itemgetter 

vel = [line.strip() for line in open("base.txt", 'r')] 
ind = [line.strip() for line in open("new2.txt", 'r')] 

print type(vel) 
print type(ind) 

adict = dict(itertools.izip(ind,vel)) 

newlist = sorted(adict, key=itemgetter(ind)) 

私の考えでは、リストとしてファイルを読み込む辞書を作成し、値を整理しようとしたが、このコードは動作しません。 私はこれは、私が欲しいものIwantない

2.900000e+03 0 
2.900000e+03 1 
2.900000e+03 10 
2.900000e+03 100 
2.900000e+03 1000 
2.900000e+03 1001 
2.900000e+03 1002 
2.900000e+03 1003 
2.900000e+03 1004 
2.900000e+03 1005 
2.900000e+03 1006 
2.900000e+03 1007 
2.900000e+03 1008 
2.900000e+03 1009 
2.900000e+03 101 
2.900000e+03 1010 
2.900000e+03 1011 
2.900000e+03 1012 

を持って、私はCPandaのソリューションをしようとすると、この

<type 'list'> 
<type 'list'> 
Traceback (most recent call last): 
    File "m1.py", line 11, in <module> 
    newlist = sorted(adict, key=itemgetter(ind)) 
TypeError: string indices must be integers, not list 

ファイルはここに

http://pastebin.com/VfXZB4W3

http://pastebin.com/he1RuSnv

をしているです2番目のインデックスは0,1,2,3,4,5などになります。

+0

なぜ機能していませんか?期待される出力は何ですか、代わりに何を得るのですか、つまりエラーですか? – Francesco

+0

@Francesco投稿を編集しました。 –

答えて

2

、あなたの最後の行をエラーを解決するには、sortedと1は

newlist = [el[1] for el in sorted(adict.items())] 

ソートする必要がある辞書からキーと値のタプルのリストを返します。

次に、あなたがあなたのnewlist

に順序付けされた値を抽出し、リスト内包表記であなたはまた一つに最後の2行をマージすることができます

newlist = [el[1] for el in sorted(itertools.izip(ind,vel))] 
1

この場合の辞書または連想配列の使用は、あなたが探しているものではありません。辞書は無秩序であり、注文が重要なときには使用しないでください。

ここで述べたような別のデータ構造を使用します。

Sort a Python dictionary by value

1

この

import itertools 

with open("base.txt") as fv, open("new2.txt", 'r') as fi: 
    vel = (line.strip() for line in fv) 
    ind = (int(line.strip()) for line in fi) 
    z = itertools.izip(ind, vel) # sort according to ind 
    # itertools.izip(vel, ind) # sort according to vel 
    for i, v in sorted(z): 
     print v,i 

# interactive session 
l1 = ['2.900000e+03', 
     '2.900000e+03', 
     '2.900000e+03', 
     '2.900000e+03', 
     '2.900000e+03', 
     '2.900000e+03', 
     '2.900000e+03', 
     '2.900000e+03', 
     '2.900000e+03', 
     '2.900000e+03', 
     '2.900000e+03', 
     '2.900000e+03', 
     '2.900000e+03', 
     '2.900000e+03', 
     '2.900000e+03'] # list(vel) 
l2 = [0, 100, 200, 1, 101, 201, 2, 102, 202, 3, 103, 203, 4, 104, 204] # list(ind) 
# result 
2.900000e+03 0 
2.900000e+03 1 
2.900000e+03 2 
2.900000e+03 3 
2.900000e+03 4 
2.900000e+03 100 
2.900000e+03 101 
2.900000e+03 102 
2.900000e+03 103 
2.900000e+03 104 
2.900000e+03 200 
2.900000e+03 201 
2.900000e+03 202 
2.900000e+03 203 
2.900000e+03 204 
  • をお試しくださいリストの代わりにジェネレータ式を使用して、メモリ効率とスピードを向上させます。
  • 使用コンテキストマネージャそれはあなたのために動作しない場合は、自動的にclose開いているファイル

にコメントしてください。

+1

@C Pandaこれは動作しません。あなた自身を試すことができるようにファイルを貼り付けます。 –

+0

あなたは2番目のものを並べ替えたいと思っています。最初のものを手配したいですか? –

+0

はい、2つ目は0から昇順に進み、最初のものを並べ替える必要があります。 –

関連する問題