2017-12-22 12 views
2

여기에 두 사전의 집합 인 XY이 있습니다. CSV 모듈의 DictReader을 사용하여 저장했습니다.하나의 dict 객체에 저장된 여러 개의 순서가 지정된 사전에서 항목을 추출하십시오.

순서가 지정된 두 개의 사전이 들어있는 example_dicto 사전을 호출 할 수 있습니다.

Name   Type Size Value 
example_dict dict 2  {'X':OrderedDict, 'Y': OrderedDict} 

이 좋아, 그래서 X을 알고 Y 여기에 기본 키에 : 같은 설명을 위해, 스파이더에서 변수 탐색기에서이 보인다. 그러나이 두 사전을 통해 가치를 찾아보고 싶습니다. XDuration 열이 있고 YDuration (min) 열이 있다고 가정하고 행에 따라이 열을 읽고 해당 값을 반환하는 함수가 필요합니다. 내가 info_from_row를 호출 할 때

def info_from_row(row, dictionary): 
    if dict == 'X': 
     duration = float(row['Duration']) 
    else: 
     duration = float(row['Duration (min)']) 
    return duration 

는, 파이썬은 역 추적이 '키'중 어느 것도 존재하지 내게 말하고있다 일반적인 KeyError를 반환합니다. 그래서 기본적으로 사전의 컬렉션 인 사전을 색인화 한 다음 값을 반환하기 위해 '주요'키 X와 Y 내의 색인 키를 색인해야합니다. dict['key'] 메서드에서 오류가 발생하고 'Duration' in XFalse을 반환하므로 인덱스를 어떻게 작성합니까?

더 명확한 설명을 위해,이 사전은 다음과 같이 :

print(example_dict) 

{'X': OrderedDict([('ID', '123456'), ('Duration', '54941')]), 
'Y': OrderedDict([('ID', '789101'), ('Duration (min)', '7869')])} 
+0

이 함수를 어떻게 부르나요? 당신은 어떤 논쟁을하고 있습니까? –

+0

이 함수를 호출하는 문법에 의문이 생겼습니다. 간단한'info_from_row (5, 'X')'는 저에게 그 오류를주고 있습니다. 이것은'X'의'Duration' 열의 다섯 번째 값에 대한 값을 반환합니다. –

+0

''example_dict [ 'X'] [ 'Duration']''''54941''' 괜찮습니다.''info_from_row (example_dict, 'X')''를 호출하는 경우''row [ 'Duration']''는 실제로''exampld_dict [ 'Duration']''이며 실제로는''KeyError' '. ''row [dict] [ 'Duration']''과''row [dict] [ 'Duration (min)']''과 같은 것을 사용해야합니다. (또한,''dict'' 변수를 호출하지 마십시오. 파이썬 내장 식입니다 ...). –

답변

2

나는 당신이 당신이 원하는 방법을 달성하는 것입니다 무엇인지에 매우 혼란 생각합니다. 내가 제대로 질문을 이해 가정하면, 이것은 내가 어떻게 할 것입니다 : 당신이 볼 수 있듯이 당신이 조회 할

from collections import OrderedDict 

def info_from_row(my_dict): 
    try: 
     return float(my_dict['Duration']) 
    except KeyError: 
     return float(my_dict['Duration (min)']) 

example_dict = {'X': OrderedDict([('ID', '123456'), ('Duration', '54941')]), 
       'Y': OrderedDict([('ID', '789101'), ('Duration (min)', '7869')])} 

print(info_from_row(example_dict['X'])) # -> 54941.0 
print(info_from_row(example_dict['Y'])) # -> 7869.0 

, 지속 시간에 관계없이 subdictionary의 인쇄됩니다. -


try 사용하지 않는 똑같이 할 수있는 또 다른 방법 except은 이것이다 :

정확히 같은 결과를 가지고 동일한 방법이라고
def info_from_row(my_dict): 
    if 'Duration' in my_dict: 
     return float(my_dict['Duration']) 
    else: 
     return float(my_dict['Duration (min)']) 

; info_from_row(example_dict['Y']).


당신은뿐만 아니라 주요 key ('X' 또는 'Y') 될 수있는 함수 인수를 원하는 경우에, 당신은 약간과 같이 기능 (그 중)을 수정할 수 있습니다

def info_from_row(my_dict, main_key): 
    if 'Duration' in my_dict[main_key]: 
     return float(my_dict[main_key]['Duration']) 
    else: 
     return float(my_dict[main_key]['Duration (min)']) 

하지만 그때를 호출 문을 수정해야합니다.

print(info_from_row(example_dict, 'X')) # -> 54941.0 
print(info_from_row(example_dict, 'Y')) # -> 7869.0 
+0

그래, 분명히 내가 초보자 파이썬 경험에서 처음으로 사전과 사전을 볼 수 있기 때문에 다소 혼란 스럽다 : P –

+0

@ Shiv_90 그럼, 뭔가 배웠 으면 좋겠다! 건배. –