1

Python辞書を作りたいです。0.25、0.30、0.35 などの値をこのディクショナリのキーにする必要があります。問題は、0.264、0.313、0.367 のような値があることです。この値がキーにアクセスできるようにします。たとえば、0.25 (含む) から 0.30 (含まない) までのすべての値で、キー 0.25 の下の値にアクセスします。これを行う方法はありますか?どういうわけか前にそれをやったと思いますが、今はアイデアがありません。前もって感謝します。

4

2 に答える 2

8

キーを丸めるdict調整さ__getitem__れた 、__setitem____delitem____contains__get()pop()およびメソッドを使用して のサブクラスを作成します。update()

class RoundingDict(dict):
    def _round(self, key):
        return int(key * 20) / 20.0

    def __contains__(self, key):
        return super(RoundingDict, self).__contains__(self._round(key))

    def __getitem__(self, key):
        return super(RoundingDict, self).__getitem__(self._round(key))

    def __setitem__(self, key, value):
        super(RoundingDict, self).__setitem__(self._round(key), value)

    def __delitem__(self, key):
        super(RoundingDict, self).__delitem__(self._round(key))

    def get(self, key, default=None):
        return super(RoundingDict, self).get(self._round(key), default)

    def pop(self, key, default=None):
        return super(RoundingDict, self).pop(self._round(key), default)

    def update(self, iterable):
        try:
            super(RoundingDict, self).update({
                self._round(k): v for k, v in iterable.iteritems()})
        except AttributeError:
            super(RoundingDict, self).update((
                (self._round(k), v) for k, v in iterable))

これは、個々のキーを取得、設定、または削除するとき、および複数のキーで辞書を更新するときに、任意のキーを最も近い0.05倍数に下げます。

>>> d = RoundingDict()
>>> d[0.346] = 'Foo'
>>> d[0.34]
'Foo'
>>> d[0.30]
'Foo'
>>> d[0.35]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 6, in __getitem__
KeyError: 0.35
>>> d.get(0.34)
'Foo'
>>> d.get(0.35, 'default')
'default'
于 2014-01-23T15:35:42.080 に答える
1

必要なのは__getitem__、標準メソッドを呼び出す前にメソッドが値を切り捨てるカスタム辞書クラスを作成すること__getitem__です。

于 2014-01-23T15:28:20.707 に答える