将键更改为dict或OrderedDict的小写

时间:2013-05-02 16:36:52

标签: python dictionary ordereddictionary

以下适用于字典,但不适用于OrderedDict。因为它似乎形成一个无限循环。你能告诉我为什么吗? 如果函数输入是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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

由于在开始时直接捕获了密钥,因此在字典中更改项目时,它们不会更新。