2012-02-26 14 views
2

辞書をソートして検索する必要があります。私はその辞書はソートできないことを知っています。しかし、私はそれを並べ替えた形式で検索する必要があります。辞書自体はソートする必要はありません。Pythonで辞書を検索してソートする

2つの値があります。キーであり、キーに関連付けられた文字列は整数値です。私は整数に基づいてソートされた表現を得る必要があります。私はOrderedDictでそれを得ることができます。

しかし、辞書全体の代わりに、上位50個の値だけを印刷する必要があります。 RegExを使用していくつかのキーを抽出する必要があります。 「a」と5の長さで始まるすべてのキーを言う。

誰かがいい方法でPythonで良い形式で印刷する方法を教えてもらえますか?のような:

{'secondly': 2, 
'pardon': 6, 
'saves': 1, 
'knelt': 1} 

1行のインディアン。あなたの時間をありがとう。

+1

[pprint](http://docs.python.org/library/pprint.html)を使用すると、辞書を複数行にわたってきれいに印刷できます。 –

答えて

3

あなたは整数値に基づいて、辞書をソートする場合は、次のことを行うことができます。

[('pardon', 6), ('secondly', 2), ('saves', 1), ('knelt', 1)] 

あなたがa[:50]を使用してトップ50に制限し、その後、youreの検索パターンで、キーを検索することができます

d = {'secondly': 2, 'pardon': 6, 'saves': 1, 'knelt': 1} 
a = sorted(d.iteritems(), key=lambda x:x[1], reverse=True) 

aはタプルのリストが含まれます。

1

あなたは既にOrderedDictを使用しているので、おそらくリストの理解で必要なことを行うことができます。次のようなものがあります。

[ value for value in d.values()[:50] if re.match('regex', value) ] 

もっと具体的なものが必要な場合は、現在のコードを投稿してください。マルチラインはかなりの印刷については

、必要に応じてオプションのwidthパラメータでpprintを使用します。

In [1]: import pprint 
In [2]: d = {'a': 'a', 'b': 'b' } 
In [4]: pprint.pprint(d) 
{'a': 'a', 'b': 'b'} 
In [6]: pprint.pprint(d,width=20) 
{'a': 'a', 
'b': 'b'} 
1

いいフォーマットの場合は、pprint moduleをご覧ください。

私が正しく理解している場合、OrderedDictは本当にあなたが望むものではありません。 OrderedDictキーが追加された順序を覚えておいてください。彼らは値を追跡しません。あなたが最初のデータを変換するための発電機を使用して欲しいものを得ることができます:

import re, operator 
thedict = {'secondly':2, 'pardon':6, ....} 
pat = re.compile('^a....$') # or whatever 
top50 = sorted(((k,v) for (k,v) in thedict.iteritems() if pat.match(k)), reverse=True, key=operator.itemgetter(1))[:50] 
1

dicionaryの彼らは、キーのにあなたが並べ替えることができます:

dict = {'secondly': 2, 
     'pardon': 6, 
     'saves': 1, 
     'knelt': 1} 

for key in sorted(dict.keys()): 
    print dict[key] 

をこのキーに基づいて出力をソートします(で。あなたのケースアルファベット順に文字列値)

1

あなたを助けることができるいくつかのさまざまなツールがあります。

  • T彼はsorted関数はiterableを受け取り、順番に要素を反復処理します。だから、for key, value in d.iteritems()のようなものを言うことができます。
  • filter関数は、反復可能および機能を取り、そして機能がTrueに評価される要素のみを返します。たとえば、filter(lambda x: your_condition(x), d.iteritems())は、キー値タプルのリストを提供します。このタプルは、上記のようにソートできます。 (Pythonの3では、filterにも優れているイテレータを返します。)
  • ジェネレータ式は、あなたが一つに上記のすべてを兼ね備えてみましょう。たとえば、値だけを気にする場合は、(value for key, value in sorted(d.iteritems()) if condition)と書くと、イテレータが返されます。
2

並べ替えられたdictを取得する方法があります。sortediteritems()はお友達です。

data = {'secondly': 2, 'pardon': 6, 'saves': 1, 'knelt': 1} 

私が最も使用パターンは次のとおりです。

key = sorted(data.iteritems()) 
print key #[('knelt', 1), ('pardon', 6), ('saves', 1), ('secondly', 2)] 

key_desc = sorted(data.iteritems(), reverse=True) 
print key_desC#[('secondly', 2), ('saves', 1), ('pardon', 6), ('knelt', 1)] 

値ではなく、あなたがのソートキー機能をオーバーライドする必要がキーにソートします。

value = sorted(data.iteritems(), key=lambda x:x[1]) 
print value #[('saves', 1), ('knelt', 1), ('secondly', 2), ('pardon', 6)] 

value_desc = sorted(data.iteritems(),key=lambda x:x[1], reverse=True) 
print value_desC#[('pardon', 6), ('secondly', 2), ('saves', 1), ('knelt', 1)]