2013-05-02 5 views
0

다음 작업은 사전에는 있지만 OrderedDict에는 해당되지 않습니다. od는 무한 루프를 형성하는 것처럼 보입니다. 왠지 말해줘? 함수 입력이 dict 인 경우 dict를 반환해야하고, 입력이 OrderedDict이면 od를 반환해야합니다.dict 또는 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 

다른 방법은 발전기를 사용하는 대신에 언급 sberry으로 iterkeys

+0

일단 내가 생성기를 만들었다면 그것이 설정되었다고 생각했습니다. 그 점을 분명히 해 주어서 고맙습니다. 하지만 새 dict를 만들고 싶지 않습니다. 동일한 유형의 dict/orderedDict를 해당 유형을 테스트하지 않고 유지하고 동일한 dict을 유지하려고합니다. 그런 경우 d.iterkeys() 대신 d.keys()를 사용해야합니다. –

+0

그러나 왜 그것이 사전을 위해 일하고 있었습니까? 생성자는 계속 추가 될 때 키를 생성하고 무한 루프를 생성해야합니다. –

+0

dict의 크기가 변경되지 않으면 대문자와 소문자간에 전환하면 키가 같은 위치에 유지됩니다. 그래서 'ONE'을 'one'을 키로 바꾸는 것은 같은 인덱스에서 키를 대체 할 것입니다. OrderedDict는 항상 키/값을 추가합니다. – sberry

0

keys를 사용하지 않는 것, 무한 루프는 수정과 동시에 DICT를 읽고 본질적으로 같다.

아마 가장 간단한 해결책은 OrderedDict.iterkeys() 대신 OrderedDict.keys()을 사용하는 것입니다 항목이 DICT에서 변경으로

키가 시작 직접 캡처로
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.keys()가 작동합니다. 고맙습니다. d.iterkeys()를 사용하여 시간을 절약하고 싶습니다. –