2012-03-20 7 views
0

値に基づいてPython辞書を検索し、キー出力を得ることは私には合理的です。しかし、検索に別の制約を追加したい場合はどうすればよいでしょうか?この方法は、唯一その値に一致する一つのキーを返すのでキーマッチング値を返す - 制約を追加する

minValue[id] = min(data[id].items(), key=lambda x: x[1]) 

:例えば

は、ここで私は、その最小値のキーを返し、最小値を(多次元)辞書を検索しています複数あるかもしれないが、別の制約を追加したい。

追加するエレガントな方法がありますか?全体の最小値を含み、一致するキーの長さが最も長い戻りキー?

答えて

1

私は、Pythonが多次元辞書を直接提供しないので、辞書がどのように見えるかを明確にするために具体的な例が役立つと思います。

私はそれがこのようなものになりますことを前提としています。あなたがmin(data[id].items(), key=lambda x: x[1])を行うときに、あなたはそれが('a', 1)を返すために、最長の長さのマッチングをチェックすることは与えるだろう何をしたいように、data = {'a': 1, 'b': 2, 'b': 3}を(注意して、これが有効なのpythonではありません!)おそらく[( 'b'、2)、( 'b'、3)]。

それはあなたが何を意味するかである場合、最も簡単な方法は、セットでdefaultdictを使用することです:

>>> data = defaultdict(set) 
>>> data['a'].add(1) 
>>> data['b'].add(2) 
>>> data['b'].add(3) 
>>> min(data.items(), key=lambda x: min(x[1])) 
('a': {1}) 
>>> min(data.items(), key=lambda x: max(len(x[1]))) 
('b': {2, 3}) 
1

さて、あなたはキー機能に長さを追加することができます。同じ値と同じ長さを持つ2つがある

>>> data = {'a': 1, 'aa': 1, 'b': 2, 'c': 3} 
>>> min(data.items(), key=lambda x: x[1]) 
('a', 1) 
>>> min(data.items(), key=lambda x: (x[1], -len(x[0]))) 
('aa', 1) 

が、何か?あなたは、出力が何であるかを知らない同じ問題に戻ります。私はおそらく、一致するキーと値のペアのリストを作成し、それらを並べ替えたり、何かをするだろうが、正しいことはおそらくキーが実際に意味するものに依存するでしょう。

関連する問題