2015-10-27 8 views
7

popは、辞書(既知のキーが指定されている)で使用されると、そのキーを持つ項目を辞書から削除し、対応する値も返す、小さな機能です。しかし、もし私も鍵を欲しいのですが?キーをポップするのはちょっとした方法です、辞書からの値は?

pair = (key, some_dict.pop(key)) 

をしかし、場合が言う、私は希望以上のアイデアを、次の、最も低い値を持つキーと値のペアをポップしたかった:

はもちろん、シンプルなケースでは、私はおそらくこのような何かを行うことができます私は二度(明らかに私は、変数でminからの出力を格納することができ、操作をしなければならないと...これを行うには恐ろしいです

pair = (min(some_dict, key=some.get), some_dict.pop(min(some_dict, key=some_dict.get))) 

を...持っているが、私はまだと完全に満足していませんそれ)。だから私の質問です:これを行うエレガントな方法はありますか?ここに明白なトリックがないのですか?

+0

キーと値のペアを与えカスタムdictを作成するシンプルな実装

class CustomDict(dict): def pop_item(self, key): popped = {key:self[key]} #save "snapshot" of the value of key before popping self.pop(key) return popped a = CustomDict() b = {"hello":"wassup", "lol":"meh"} a.update(b) print(a.pop_item("lol")) print(a) 

です – JBernardo

+1

@JBernardo私はそれを考えていました。それは明らかに良いですが、私はまだ1つなしでより良い方法があるべきだと感じています。 –

+1

'dict'ではなく、ヒープが必要な場合があります。 'heapq'モジュールを参照してください。 – chepner

答えて

3

あなた自身abstract base classesを定義するためのインフラストラクチャを提供パイソンABC Sを使用して辞書オブジェクトを定義することができます。

from collections import Mapping 

class MyDict(Mapping): 
    def __init__(self, *args, **kwargs): 
     self.update(dict(*args, **kwargs)) 

    def __setitem__(self, key, item): 
     self.__dict__[key] = item 

    def __getitem__(self, key): 
     return self.__dict__[key] 

    def __delitem__(self, key): 
     del self.__dict__[key] 

    def pop(self, k, d=None): 
     return k,self.__dict__.pop(k, d) 

    def update(self, *args, **kwargs): 
     return self.__dict__.update(*args, **kwargs) 

    def __iter__(self): 
     return iter(self.__dict__) 

    def __len__(self): 
     return len(self.__dict__) 

    def __repr__(self): 
     return repr(self.__dict__) 

デモ:

d=MyDict() 

d['a']=1 
d['b']=5 
d['c']=8 

print d 
{'a': 1, 'c': 8, 'b': 5} 

print d.pop(min(d, key=d.get)) 
('a', 1) 

print d 
{'c': 8, 'b': 5} 

:@chepnerあなたがpopitemを上書きすることができ、より良い選択肢としてのコメントで示唆したように、そして、あなたの必要性に基づいて、Pythonの辞書オブジェクトのpop属性をオーバーロード既にキーと値のペアを返します。ここ

+0

既にキーと値のペアを返す 'popitem'をオーバーライドし、オプションのキー引数を取ることをお勧めします。 – chepner

+0

@chepnerはい、それは良いでしょう。私はちょうど方法を示した。 – Kasramvd

+1

ありがとう、それは一般的な問題の解決策を与えたとして受け入れられました。 –

3

ヒープは、ユーザーが説明するポップアップ操作をサポートしています。ただし、まず辞書からヒープを作成する必要があります。

import heapq 
# Must be two steps; heapify modifies its argument in-place. 
# Reversing the key and the value because the value will actually be 
# the "key" in the heap. (Or rather, tuples are compared 
# lexicographically, so put the value in the first position.) 
heap = [(v, k) for k, v in some_dict.items()] 
heapq.heapify(heap) 

# Get the smallest item from the heap 
value, key = heapq.heappop(heap) 
+0

お返事ありがとうございます。これは最小限には最適ですが、これはキーと値の両方をポップするより一般的な問題の一例に過ぎません(特定のキーがあればそれは不明です)。理想的な解決策は、他の基準で同じことをすることができます。 –

+0

@ J.F.Sebastian Oops。私はそれを知っていましたが、何かをテストしている間、私は怠け者でした。そして、 'heap 'は、ヒープ型のインスタンスではなく、' heapq'関数に従順なリストだったことを忘れてしまいました。 – chepner

1

は、そこでここでは、変数でmin` `からの出力を保存したい項目をポップし

+1

いくつかの説明を加えてください! –

+0

ok wilco説明を追加します – Zion

関連する問題