2013-05-02 81 views
0

以下字典的作品,但不是OrderedDict。對於od來說,它似乎形成了一個無限循環。你能告訴我爲什麼嗎? 如果函數輸入是字典它必須返回字典,如果輸入是OrderedDict它必須返回od。更改鍵爲小寫字母或OrderedDict

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

它形成的原因有序字典添加新成員(爲末)

由於您使用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

+0

我以爲是一旦我創建了它設置的發生器。謝謝你澄清這一點。 但我不想創建一個新的字典,我想保持相同類型的字典/ orderedDict沒有測試他們的類型,因此保持相同的字典。 在這種情況下,應該使用d.keys()而不是d.iterkeys()。 – 2013-05-02 17:10:33

+0

但爲什麼它爲字典工作?生成器在添加時仍應繼續生成密鑰,並創建無限循環。 – 2013-05-02 17:25:02

+0

在大小寫不變的情況下,在大寫和小寫之間切換可將鑰匙保持在相同的位置。所以,簡單地將'ONE'換成'one'作爲關鍵字將取代相同索引處的關鍵字。 OrderedDict將始終追加鍵/值。使用d.keys()工作的 – sberry 2013-05-02 17:33:06

0

如前所述sberry,無限循環基本上如要修改,並在同一時間閱讀的字典。

也許最簡單的解決方案是使用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 

的鍵在開始直接拍下,他們將不會得到項目在字典改變更新。

+0

。謝謝。 我想用d.iterkeys()來節省一些時間。 – 2013-05-02 17:26:42

相關問題