2

クラスの主な機能は、キーとしての単語ととしての ID 番号を持つ辞書です(注: エントリの一部が削除されているため、ID は連続していません)。

x = {'foo':0, 'bar':1, 'king':3}

customdict私が作成したクラスの iterator 関数を書いたときrange(1 to infinity)、KeyError のために反復処理中に壊れます。

class customdict():
    def __init__(self,dic):
        self.cdict = dic
        self.inverse = {}

    def keys(self): 
        # this is necessary when i try to overload the UserDict.Mixin
        return self.cdict.values()

    def __getitem__(self, valueid):
        """ Iterator function of the inversed dictionary """
        if self.inverse == {}:
            self.inverse = {v:k for k,v in self.cdict.items()}
        return self.inverse[valueid]

x = {'foo':0, 'bar':1, 'king':3}
y = customdict(x)

for i in y:
    print i

try and exceptにアクセスせずに、クラスlen(x)内の辞書の反復をどのように解決できますか? customdict 理由 x は >>> であり、len(x) はリアルタイムでは時間がかかりすぎます。

試してみたところUserDict.DictMixin、突然機能しました。なぜそうなのですか?:

import UserDict.DictMixin
class customdict(UserDict.DictMixin):
 ...

__future__どうにかして python3 で mixins が廃止されたように見えるので、Mixin を使用しないようにする方法はありますか?

4

3 に答える 3

3

以下のメソッドを定義します。

def __iter__(self):
    for k in self.keys():
        yield k

UserDict.DictMixin を試してみたところ、突然動作しました。なぜそうなのですか?:

DictMixin上記のメソッドを定義するため__iter__です。( UserDict.py ソースコード)

于 2013-10-13T10:37:38.217 に答える
2

別の方法を共有してください:

class customdict(dict):
    def __init__(self,dic):
        dict.__init__(self,{v:k for k,v in dic.items()})        

x = {'foo':0, 'bar':1, 'king':3}
y = customdict(x)


for i in y:
    print i,y[i]

結果:

0 foo
1 bar
3 king
于 2013-10-13T11:41:00.263 に答える
1
def __iter__(self):
    return iter(self.cdict.itervalues())

Python3では、values()代わりに呼び出します。

あなたはUserDict.DictMixin時代遅れであることは正しいですが、問題はミックスインであるという事実ではなく、より賢明な基礎となるインターフェースcollections.Mappingを使用しているという事実です。collections.MutableMappingしたがって、 から更新する場合は、の代わりにandにUserDict.DictMixin切り替えてcollections.Mapping実装する必要があります。__iter__()__len__()keys()

于 2013-10-13T10:26:22.403 に答える