2014-04-12 2 views
0

내 작업 : 다른 크기 (1,2,3,4 및 "qwe", "asd", "zxc"등) 목록이 2 개 있습니다. 다음 조건으로이 목록을 사용하여 사전을 어떻게 만들 수 있습니까? 값보다 많은 키가있는 경우 - dict [key] = None. 값의 개수가 더 많으면 그냥 inore입니다. 내 코드 : 역 추적 (가장 최근 통화 최종) :2 목록에서 사전 만들기

list1=[1,2,3,4] 
list2=["qwe","asd","zxc"] 
dictx={} 
for x in range(len(list1)): 
if x>len(list2): 
    dictx[list1[x]]=None 
else: 
    dictx[list1[x]]=list2[x] 

그러나 나는 오류를 잡아 파일 "", 5 호선, dictx [목록 1의 [X] =리스트 2 [X] IndexError에 : 목록 인덱스가 범위를 벗어났습니다 어디에서 실수합니까? Python 3.4 Upd.It 작동하지만이 코드에서 실수가 어디에서 발생했는지 이해하려고합니다. 아무도 생각하지 않았 니?

답변

2

itertools.chain 패드를 사용하고 itertools.repeatNone s의 값리스트는, 그리스트를 압축 :

from itertools import chain, repeat 

d = dict(zip(list1, chain(list2, repeat(None)))) 

repeat(None) 영원히 None을 수득 무한 반복기이다.

chain(list2, repeat(None))list2에서 항목을 산출하는 반복자이며 list2이 부족할 때 None을 산출합니다.

zip(...)list1과 패딩 된 list2에서 해당 요소 쌍 목록을 반환합니다. 입력이 없어지면 zip이 멈추므로 입력 값은 list1입니다.

마지막으로 dict(...)은 키 - 값 쌍의 목록을 가져와 해당 값에 해당하는 키로 사전을 만듭니다.

+0

덕분에, 지금은 일입니다. –

3

다음과 같이도 itertools.izip_longest를 사용할 수 있습니다

import itertools 
list1=[1,2,3,4] 
list2=["qwe","asd","zxc"] 
print ({l1:l2 for l1,l2 in itertools.izip_longest(list1,list2,fillvalue=None)}) 

편집 : 파이썬 3에서 :

import itertools 
list1=[1,2,3,4] 
list2=["qwe","asd","zxc"] 
print ({l1:l2 for l1,l2 in itertools.zip_longest(list1,list2,fillvalue=None)}) 

출력 :

{1: 'qwe', 2: 'asd', 3: 'zxc', 4: None} 
+0

오류 : http://imgur.com/ePGO7i2 –

+0

@ user3342929 :이 대답은 Python 2 : 괄호 추가 :'print ({l1 : l2 .. stuff ..})'를 사용하고'izip'을'zip'으로 변경합니다. . – DSM

+0

@DSM : 도움을 주셔서 감사합니다 ... 파이썬 2.7에서 테스트했습니다 ... 지금 파이썬 3에서 컴파일하도록 수정했습니다 – user3