0

以下は辞書では機能しますが、OrderedDict では機能しません。od については、無限ループを形成しているようです。なぜか教えてくれますか?関数入力が dict の場合は dict を返す必要があり、入力が OrderedDict の場合は od を返す必要があります。

def key_lower(d):
    """returns d for d or od for od with keys changed to lower case
    """
    for k in d.iterkeys():
        v = d.pop(k)
        if (type(k) == str) and (not k.islower()):
            k = k.lower()
        d[k] = v

    return d
4

2 に答える 2

2

順序付けられた辞書が新しいメンバーを (最後に) 追加する方法のために、無限ループを形成します。

を使用iterkeysしているため、ジェネレーターを使用しています。割り当てるd[k] = vと、新しいキー/値が辞書の最後に追加されます。ジェネレーターを使用しているため、キーを追加し続けると、引き続きキーが生成されます。

これはいくつかの方法で修正できます。1 つは、以前のものから新しい順序付けられた dict を作成することです。

def key_lower(d):
     newDict = OrderedDict()
    for k, v in d.iteritems():
        if (isinstance(k, (str, basestring))):
            k = k.lower()
        newDict[k] = v
    return newDict

もう1つの方法は、ジェネレーターを使用keysせず、代わりに使用することですiterkeys

于 2013-05-02T16:39:42.563 に答える
0

sberryが述べたように、無限ループは基本的に、dictを同時に変更して読み取るためです。

おそらく最も簡単な解決策は、OrderedDict.keys()代わりに使用することですOrderedDict.iterkeys()

for k in d.keys():
    v = d.pop(k)
    if (type(k) == str) and (not k.islower()):
        k = k.lower()
    d[k] = v

キーは最初に直接キャプチャされるため、辞書でアイテムが変更されても更新されません。

于 2013-05-02T16:46:23.363 に答える