3

私はそれらすべてを使用して、割り当てられたIANA値の名前をパケットに出力しています。したがって、すべての辞書のデフォルト値は「RESERVED」です。

キーがdにない場合、デフォルトを返すように、d.get(key,default)辞書にアクセスするのは使用したくありません(これはすべての辞書で同じです)。d[key]

私は必ずしも辞書を使う必要はありませんが、それらは直感的な選択でした...また、私がこれを行うことができる辞書

d = {
   1..16 = "RESERVED",
   17 : "Foo",
   18 : "Bar,
   19..255: "INVALID"
  }

推奨されるソリューションになります

タプルは別の選択肢かもしれませんが、値を割り当てる際のエラーを相殺する傾向があります...(そして私のコードは「人間が読める」ものではありません)

そうそう、Python 2.4

4

3 に答える 3

9

Python 2.5に移行できる場合は、次に示すようにdefaultdictクラスがあります。必要なものを返す初期化子を渡すことができます。そうでなければ、あなたはそれのあなた自身の実装を転がさなければならないでしょう、私は恐れます。

于 2009-10-22T08:37:59.057 に答える
4

可能であれば、マリオのソリューションを使用してください。

できない場合は、辞書のようなオブジェクトをサブクラス化する必要があります。これで、「dict」から直接継承することでそれを行うことができ、高速かつ効率的になります。「dict」から継承できない古いPythonバージョンには、純粋なPython辞書の実装である「UserDict」があります。

それで、あなたはそれをこのようにするでしょう:

#!/usr/bin/env python
# -*- coding= UTF-8 -*-

import UserDict

class DefaultDict(UserDict.UserDict) :

    default_value = 'RESERVED'

    def __getitem__(self, key) :
        return self.data.get(key, DefaultDict.default_value)


d = DefaultDict()
d["yes"] = True;
print d["yes"]
print d["no"]

「UserDict」は「dict」よりも遅いことに注意してください。

于 2009-10-22T09:00:38.123 に答える
0

次のクラスを使用できます(Python 2.7でテスト済み)。ゼロを任意のデフォルト値に変更するだけです。

class cDefaultDict(dict):
    # dictionary that returns zero for missing keys
    # keys with zero values are not stored

    def __missing__(self,key):
        return 0

    def __setitem__(self, key, value):
        if value==0:
            if key in self:  # returns zero anyway, so no need to store it
                del self[key]
        else:
            dict.__setitem__(self, key, value)
于 2014-04-30T13:03:33.500 に答える