2010-02-23 8 views
40

값이 없음이면 ""(빈 문자열)로 변경하고 싶습니다.파이썬에서 사전을 반복하여 어떻게 같으면 값을 변경합니까?

I는 다음과 같이 시작,하지만 난 잊지 :

for k, v in mydict.items(): 
    if v is None: 
... right? 
+8

이것은 "명성"시스템에서의 총 결함의 예입니까, 아니면 트롤이나 총격 4 월 1 일 개그입니까? –

+2

귀하의 의견은 OP tbh에 대한 더 많은 담당자를 생성한다고 생각합니다. –

+6

@ JohnMachin : 왜 이것이 트롤이라고 생각하는지 잘 모르겠습니다. 도움이되는 질문이었습니다. 분명히 17 명이 동의합니다. 나는 그것을 반복하면서 dict를 업데이트 할 수 있는지보고 싶었 기 때문에 웹에서 'python iterate dict update values'를 찾아서이 질문에 이르게했다. 여기에는 내가 찾고있는 해답을 제공하는 설명이 포함되어 있습니다. 문법과 형식은 훌륭하지 않지만 좋은 질문입니다. –

답변

95
for k, v in mydict.iteritems(): 
    if v is None: 
     mydict[k] = '' 

보다 일반적인 경우, 예를 들어, 키를 추가하거나 제거하는 경우 반복되는 컨테이너의 구조를 변경하는 것이 안전하지 않을 수 있습니다. 따라서 items을 사용하여 독립적 인 목록 복사본을 루프하면 신중할 수 있습니다. 주어진 기존 인덱스가 이 아니기 때문에에 문제가 없으므로, Python 2.any에서는 iteritems을 사용하는 것이 더 좋습니다.

+0

아마도 s/index/key/ –

+0

@ 존, 내장 된 ** 컨테이너 **에 적용됩니다 - 그냥 dict에 대한 목록만큼이나 - "인덱스"는보다 일반적인 용어라고 생각합니다. "키". –

+2

'mydict [k] = '''- 당신의 예제는'k' 인덱스를 불변 오브젝트'''로 갱신합니다. 그래서이 후,'k'는'v'와 완전히 다른 목적을 가리 킵니다. 이것은'.iterit()'에 문제를 일으킬 수있는 어떤 식 으로든'k' 인덱스를 변형시킬 수 있습니까? – CivFan

7

함축은 일반적으로 더 빨리, 이것은 반복하는 동안 mydict을 편집하지 않는 장점이있다 : 당신은 값 아무도없는 단지 요소의 DICT 이해를 만들 수

mydict = dict((k, v if v else '') for k, v in mydict.items()) 
+0

'.items()'를 사용하고 있다면'mydict'를'.items()'가 추가/제거하더라도 변경되지 않는리스트로 수정하면 (python2의 경우) 상관 없습니다 'mydict'의 키 –

+3

dict의 값만 변경하는 것은 결코 문제가되지 않습니다. 슬픔은 dict를 반복하면서 KEYS를 추가/삭제함으로써 발생합니다. 이해력은 무엇보다 빠릅니까? 정말 빠릅니다 : 변경할 하나 또는 두 개의 None이있을 때 전체 dict을 복사합니다. Nones에 관해서는 if if (질문을 다시 읽으십시오) 대신'if v is None'이 있어야합니다. 전체 요약 : -1 –

12

을 한 다음에 다시 업데이트 원래 :

tmp = dict((k,"") for k,v in mydict.iteritems() if v is None) 
mydict.update(tmp) 

업데이트는 - 한 몇 가지 성능 테스트

100 개에서 10,000 개까지의 항목으로 다양한 값을 지정하면 Alex 솔루션의 성능은이 솔루션보다 약 2 배 빠릅니다.

+0

흠, Python 2의 경우.7 나는 알렉스의 방법이 여전히 더 빠르지 만 동일한 성능을 보았다. 나는 1000에서 100000 값과 None 백분율로 2에서 50 %로 dicts를 시도했다; 비교를 위해 [buckley] (http://stackoverflow.com/a/2315545/558008)에서 (s/items/iteritems /와 함께) 메서드는 약 4 배 느렸다. 양식이 반복적으로 사전을 변경할 수 있기 때문에 이것은 흥미로운 일이라고 생각합니다. –

관련 문제