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新的键/值添加到字典的末尾。因为您使用的是生成器,所以在您继续添加密钥时,它将继续生成密钥。

您可以通过几种方式解决此问题。一种是从前一个中创建一个新的有序字典。

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

另一种方法是不使用生成器并使用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 回答