2011-09-08 11 views
8

すでにPythonのソートリスト/ディクショナリに関する質問がたくさんあることは知っていますが、私の場合に役立つものは見つけられないでしょう。私はかなり大きなデータセットをソートするつもりです。Pythonでタプルの辞書を並べ替える

a = {'a': (1, 2, 3), 'b': (3, 2, 1)} 

私は基本的に私はそれ(nは、シグマ(x)は、シグマに関するいくつかの統計と一緒に各単語を格納している単語のリストを作成しています:

私のデータは、基本的には、現時点では、このようになります。 (x^2))

私はそれを特定の統計に基づいてソートしたいと思います。これまでのところ、私はの線に沿って何かをしようとしてきた:

b = a.items() 
b.sort(key = itemgetter(1), reverse=True) 

私はそれがタプルのタプルのその効果リストに基づいてソートされたインデックスを制御するかどうかはわかりませんか?私は効果的に2つのitemgetter操作をネストする必要があると思いますが、実際にこれを行う方法は本当にわかりません。

もっと良いデータ構造があれば、代わりに私に知らせてください。私はおそらく、小さなクラス/構造体を作成し、クラスのメンバーにアクセスするためにラムダ関数を使用する必要がありますか?

ありがとうございました

答えて

4

このようなことがありますか?

>>> a = {'a': (1, 2, 3), 'b': (3, 2, 1)} 
>>> b = a.items() 
>>> b 
[('a', (1, 2, 3)), ('b', (3, 2, 1))] 
>>> b.sort(key=lambda x:x[1][2]) # sorting by the third item in the tuple 
>>> b 
[('b', (3, 2, 1)), ('a', (1, 2, 3))] 
+0

はい、完璧感謝!しかし、私はどこかで、itemgetterはラムダ関数を使うよりも速いと読んでいます。 itemgetterを使用できない場合は、この解決方法は問題ありません。 –

+0

動作しているプログラムがあり、単体テストが完了するまで、パフォーマンスは心配しないでください。最後の*正しい*プログラムが遅すぎる場合はプロファイルし、遅いビットを最適化してください。 –

+0

良い点:)とにかく遅い、ポインタのおかげで、私はCでそれを書き換えるかもしれません:) –

1

名と協力し、インデックスが、私はクラスで行くだろうと覚えやすいです:

class Word(object):  # don't need `object` in Python 3 
    def __init__(self, word): 
     self.word = word 
     self.sigma = (some calculation) 
     self.sigma_sq = (some other calculation) 
    def __repr__(self): 
     return "Word(%r)" % self.word 
    def __str__(self): 
     return self.word 
    @property 
    def sigma(self): 
     return self._sigma 
    @sigma.setter    # requires python 2.6+ 
    def sigma(self, value): 
     if not value: 
      raise ValueError("sigma must be ...") 
     self._sigma = value 

word_list = [Word('python'), Word('totally'), Word('rocks')] 
word_list.sort(key=lambda w: w.sigma_sq) 
+0

thats有益なおかげで!クラスdefの各変数の型を明示的に定義するとは思わないでしょうか? –

+0

@technosites '各変数の型'でint vs strとfloatなどを意味する場合は、データ検証やその他のプロパティのプロパティを使用できます。 –

+0

ええ、それは私が言ったことです、ありがとう:) –

関連する問題