0

多くの列を持つCSVファイルがあります。いずれかの列の値に基づいて(番号の降順で)行を並べ替えようとしています。そして、私はトップ10を出力するためだけにそれを望んでいます。しかし、次のコードを使用すると、間違った出力が得られます。

import csv
f = open('SNPs.csv', "rU")
reader = csv.reader(f)
output = [row for row in reader]
output.sort(key=lambda x: x[32], reverse=True)
print dict((row[10], (row[11], row[8], row[32])) for row in output[:10])

出力は次のようになります。

'XRgroup8': ('38', '2', '0.47'), '2': ('30', '13', '0.37'), 'Chromosome': ('Position', 'Distance', 'GC'), 'XRgroup5': ('54', '1', '0.45')

したがって、明らかに10個の値を返しておらず、それらは順番に並んでいません。何か案は?

4

4 に答える 4

2

最初に知っておく必要がある
のは、Pythonのdictは順序付けられていないため、並べ替えることができないということです。

順序を維持するdictが必要な場合は、http://docs.python.org/2/library/collections.html#collections.OrderedDictを確認してください

2番目のこと:

dictのキーは一意です。
すでにdictにあるキーを追加しようとすると、値が上書きされます。
これが、期待していたすべての要素を取得できない最も可能性の高い理由です。

于 2012-11-05T00:38:29.093 に答える
1

リストはソートされていますoutputが、辞書は順序がありません。これが、結果の辞書に順序が表示されない理由です。

于 2012-11-05T00:36:38.503 に答える
0

文字列辞書式順序)を並べ替えていますが、番号順に並べ替えられることを期待しています。それは起こりません。おそらく、並べ替えkey関数を次のようなものに変更する必要があります。これにより、数値lambda x: float(x[32])で並べ替える浮動小数点数に基づいて並べ替えることができます。


辞書はその順序を保持しないことにも注意してください(collections.OrderedDict代わりに使用できますが、すでに知っていると思います)。

于 2012-11-05T00:36:57.960 に答える
0

走った瞬間

print dict((row[10], (row[11], row[8], row[32])) for row in output[:10])

ソートされた出力(output.sort(...))を順序のない辞書に変換しました。辞書は基本的にPythonのハッシュテーブルとして実装されています。詳細な説明については-http://mail.python.org/pipermail/python-list/2000-March/048085.html

于 2012-11-05T00:37:22.203 に答える