2012-11-24 1 views
2

이것은 IDLE2의 Python 코드이며 오류입니다.두 목록을 사전으로 변환하는 방법 (한 목록은 키이고 다른 목록은 값입니다)?

키와 값 "otro"로 각 "데이터"요소를 순서대로 포함해야합니다. 글쎄 "데이터"와 "otro"는 38 개의 문자열로 구성되어 있습니다. "dik"는 사전입니다.

>>> for i in range(len(otro)+1): 
    dik[dato[i]] = otro[i] 

Traceback (most recent call last): 
    File "<pyshell#206>", line 2, in <module> 
    dik[dato[i]] = otro[i] 
IndexError: list index out of range 
>>> 

이 문제의 범위 (0, 38) 출력 -> (0, 1,2,3 ... 37)과 오류가 이로부터 오는 모든 지저분

+2

마지막 줄을 크게 읽고 통역사가 말하는 것을 생각해 낼 수 있습니까? – JBernardo

답변

12

뭔가처럼 생각 :

dik = dict(zip(dato,otro)) 

조금 청소기입니다 ...


dik이 이미 존재하는 경우 당신은 그냥 업데이트하고 있습니다 :

dik.update(zip(dato,otro)) 

bout zip, 당신은 그것을 배우는 약간의 시간을 투자해야합니다. 그것은 매우 유용합니다.

a = [ 1 , 2 , 3 , 4 ] 
b = ['a','b','c','d'] 
zip(a,b) #=> [(1,'a'),(2,'b'),(3,'c'),(4,'d')] #(This is actually a zip-object on python 3.x) 

zip 또한 3 - 튜플의 목록을 제공합니다 예를 들어 이상의 인수 (zip(a,b,c))를 취할 수 있지만, 여기서는 논의를위한 정말 중요하지 않습니다.

이것은 정확히 dict "생성자"(유형)가 key-value 쌍을 초기화하는 것을 좋아하는 것 중 하나입니다. 각 tuple의 첫 번째 요소는 key이고 두 번째 요소는 value입니다.

+2

+1 좋은 전화. RocketDonkey의 대답이 현재 솔루션이 실패하는 이유를 설명 할 수있는 좋은 해답이긴하지만 이것이 최고의 솔루션입니다. –

+0

@ 라티웨어 - 동의. 그에게 +1하십시오. – mgilson

+0

@mgilson + 1이 주위에 있습니다 - 이것은 분명히 깨끗합니다. – RocketDonkey

10

이다 range(len(otro)+1). range을 사용하면 위 값이 실제로 반복되지 않으므로 예를 들어 range(5)이라고 말하면 반복은 이 4 인 위치 인 0, 1, 2, 3, 4이됩니다. 그런 다음 해당 요소를 가져 와서 for i in range(len(nums)+1): print nums[i]이라고 말하면 최종 ilen(nums) + 1 = 6이되며 오류가 발생할 수 있습니다. 뭔가를 반복하는

더 '파이썬'방법은 목록의 len 사용하지 않는 것입니다 - 당신은 필요한 경우 enumerate을 사용하여 인덱스를 잡아 당겨, ​​목록 자체를 반복 :

In [1]: my_list = ['one', 'two', 'three'] 

In [2]: for index, item in enumerate(my_list): 
    ...:  print index, item 
    ...: 
    ...: 
0 one 
1 two 
2 three 

이 적용 귀하의 경우에, 당신이 다음 말할 수 :

>>> for index, item in enumerate(otro): 
... dik[dato[index]] = item 

는 그러나 Pythonicity 테마 유지, @의 mgilson의 zip이 구조의 더 나은 버전입니다.

+2

-1. 이것은 문제 일 수 있지만 실제로 코드를 개선하지는 못합니다. 왜 인덱스를 반복합니까? –

+1

'for i, o in enumerate (otro) :'조금 더 깔끔합니다. 또는'd, zip (dato, otro) :'에 대해서. 또는 전체 블록 대신'dik = dict (zip (dato, otro))'를 사용하십시오. – millimoose

+0

@Lattyware 하, 내 마음을 읽고 - 지금 증강하고있어 :) – RocketDonkey