2011-12-28 3 views
0

저는 파이썬에 아주 익숙하고 for 루프 동작에 문제가 있습니다. 내 코드에서는 configobj를 사용하여 파일에서 config를 읽습니다. 구성 파일의 내용은 가변적이며 그 곳에서 문제가 발생합니다.리스트 길이 = 1 일 때의 반복 동작

if webconf.has_key(group): 
     scenario_list = webconf[group]['Scenarios']['names'] 

     for scenario in scenario_list: 

       print "Scenario name = %s\n" % scenario 

은 "scenario_list"변수가 문자열의 수를 포함합니다 :

여기 내 테스트 코드입니다. 'names'에 여러 요소가있는 경우 'scenario'는 각 요소의 값으로 설정됩니다. "names"가 1 요소 만 가지고 있으면 루프는 첫 번째 항목의 각 문자를 반복하여 내 코드를 위반합니다.

목록 길이가 1이면 "scenario_list"의 항목 값을 반환하기 위해 for 루프를 어떻게 만듭니 까?

제공된 조언을 미리 감사드립니다.

답변

0

목록이 아닌 튜플을 사용하고 있습니까?

aTuple = (1,2,3) 
aList = [1,2,3] 

튜플과 목록의 가장 큰 차이점은 튜플이 변경 가능하고 목록이 변경 가능하다는 것입니다. 즉, 목록을 사용하여 목록의 요소를 변경하거나 요소를 추가 및 제거 할 수 있습니다.

발생할 수있는 문제는 튜플 압축 풀기라는 개념과 관련이 있습니다.

aList = [0] # aList is now [0] 
notATuple = (0) # notATuple is now 0 
# there was exactly one element in the tuple, so it was unpacked in the variable 
aTuple = (0,) # aTuple is now (0,) - a tuple with one element 
# the comma indicates that you wish that the tuple should not be unpacked 

유일한 다른 문제는 하나의 시나리오가있을 때 시나리오 문자열을 목록이나 튜플에 넣지 않는다는 것입니다. 파이썬은 문자열을리스트 (잘, 더 튜플과 같다)처럼 취급한다. 따라서 문자열을 반복 할 경우 개별 문자 (경험 한 동작)를 얻을 수 있습니다. 따라서 문자가 아닌 한 문자열을 반복하려는 경우 시나리오 문자열을 목록 (또는 튜플)에 넣어야합니다. 문자열을 사용하지 않았다면 런타임 오류가 발생했을 것입니다.

+0

configobj 객체의 반환 유형을 보면 항목에 요소가 여러 개 있고 문자열이있는 경우 문자열을 반환한다는 것을 알 수 있습니다. 내가 이런 식으로해야한다고 말하는거야? "목록의 시나리오 (scenario_list) :"... – Yello

+0

나는 지금 생각합니다. for 루프 선언을 "[scenario_list]의 시나리오"로 변경하면 이제 원하는 동작을 얻게됩니다. 나를 올바른 방법으로 생각하게 만드는 데 도움을 주셔서 감사합니다 :) – Yello

+0

아아, 나는 너무 빨리 말했습니다! 이 선언은 반환 형식이 목록 일 때 여러 요소 동작을 중단합니다. ( – Yello