以下适用于字典,但不适用于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
答案 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
由于在开始时直接捕获了密钥,因此在字典中更改项目时,它们不会更新。