2016-06-30 1 views
0

OrderedDict 각 키의 문자열과 각 값의 문자열 목록을 만들고 싶습니다.OrderedDict가 반복하는 동안 단일 문자열 값을 문자로 분할하지 못하도록

from collections import OrderedDict 

# Compare a dict with an OrderedDict 
someDict = dict(a = ["foo","bar"], b = ["baz"]) 
someOrderedDict = OrderedDict([("a",("foo","bar")),("b",("baz"))]) 

키와 값에 모두 액세스 할 수있는이 사전을 반복해야합니다. 바닐라 사전에, 이것은 단순히 :

for k,v in someDict.items(): 
    for eachv in v: 
     print("do something with key = " + k + " and value = " + eachv) 
# returns the desired output: 
# do something with key = a and value = foo 
# do something with key = a and value = bar 
# do something with key = b and value = baz 

(.이가 이해에서 수행 할 수있는 경우 가르치 려하시기 바랍니다 - 나는 키에 대한 액세스 권한을 잃지 않고 수행하는 방법을 알아낼 수)

나는 OrderedDict에이를 때

내가 얻을 : 내가 잘못 뭐하는 거지

for k,v in someOrderedDict.items(): 
    for eachv in v: 
     print("do something with key = " + k + " and value = " + eachv) 
# results in undesirable splitting of value "baz" into ["b","a","z"]: 
# do something with key = a and value = foo 
# do something with key = a and value = bar 
# do something with key = b and value = b 
# do something with key = b and value = a 
# do something with key = b and value = z 

?

답변

2

당신은 추가 할 수 있습니다 단일 strfor 루프 :

,515,
someOrderedDict = OrderedDict([("a",("foo","bar")),("b",("baz",))]) 

그런 다음 반복 튜플 baz의 단일 요소를 잡아 잘 작동 :

마찬가지 []의 값을 배치함으로써 달성 될 수
for k,v in someOrderedDict.items(): 
    for eachv in v: 
     print("do something with key = " + k + " and value = " + eachv) 
do something with key = b and value = baz 
do something with key = a and value = foo 
do something with key = a and value = bar 

:

[("a", ["foo","bar"]),("b", ["baz"])] 

에도 더 나은을 사용할 수있는 사전이 있다면 사전을 확장 (압축을 풉니 다)** 구문을 활용하여 someOrderedDict에서: 그것은 동일하게하고 작동

someOrderedDict = OrderedDict(**someDict) 

훨씬 더 컴팩트하고 깨끗한 보인다.

+0

감사합니다.'**'는 다른 사용자에게 유용 할 수 있기 때문에 받아 드리고 있습니다 만, 원래 주문을 유지하면 ('OrderedDict'를 사용하는 이유이기 때문에)주의해야 할 점이 있습니다. 원래의 구조를 사용하십시오. – C8H10N4O2

+0

@ C8H10N4O2 파이썬 추적기에서 언 패킹하는 동안 순서를 유지하는 데 문제가 있다는 것을 기억합니다. 곧 추가 될 수도 있습니다. URL을 찾아서 상태를 확인할 수 있는지 보겠습니다. –

3

튜플 (("baz",)) 또는 문자열 목록이 아닌 b 키에 문자열 (("baz"))을 지정했기 때문입니다.

대신

someOrderedDict = OrderedDict([("a",("foo","bar")),("b",("baz"))]) 

someOrderedDict = OrderedDict([("a",("foo","bar")),("b",("baz",))]) 

가 (새로운 쉼표를 참고.) 시도 "baz"은 그래서 대신의 튜플로 해석 얻을 수있는 ,

관련 문제