2011-01-01 7 views
122

목록에있는 사전 a을 파이썬으로 입력하면 편리하게 사전에 매핑됩니다. 각 심지어 요소는 사전에 키를 나타내는, 다음과 같은 홀수 요소는 값 예를 들어목록을 파이썬에서 사전으로 변환

입니다

a = ['hello','world','1','2'] 

나는 사전 b,

b['hello'] = 'world' 
b['1'] = '2' 
로 변환하고 싶습니다

이 작업을 수행하는 구문 적으로 가장 깨끗한 방법은 무엇입니까? a가 큰 경우

+0

가능한 중복 (https://stackoverflow.com/questions/2597166/make-dictionary-from-list-with [파이썬 목록에서 사전 확인] -python) –

답변

193
b = dict(zip(a[::2], a[1::2])) 

, 당신은 아마 위와 같이 임시 목록을하지 않는 다음과 같은 일을 할 것입니다.

from itertools import izip 
i = iter(a) 
b = dict(izip(i, i)) 

파이썬 3에서 당신은 또한 DICT 이해를 사용할 수 있지만 아이러니하게도 나는 그것이 일반적으로 코드 냄새를 것 range()len(), 함께있을 것입니다 할 수있는 간단한 방법을 생각한다. EOL이 코멘트에 지적으로, zip() 그래서 당신이 izip() 필요하지 않습니다 이미 파이썬 3 게으른하지만

b = {a[i]: a[i+1] for i in range(0, len(a), 2)} 

는 그래서 iter()/izip() 방법은 아마도 아직 파이썬 3에서 가장 파이썬입니다.

i = iter(a) 
b = dict(zip(i, i)) 

한 줄로 쓰려면 속여서 세미콜론을 사용해야합니다.;-)

+2

... 아니면'zip (i, i)', 파이썬 3에서는'zip()'이 이제는 반복자를 반환하기 때문이다. – EOL

+4

파이썬 2.7.3도 dict comprehension이 – user1438003

3

이 가장 파이썬되지 않을 수도 있습니다,하지만

>>> b = {} 
>>> for i in range(0, len(a), 2): 
     b[a[i]] = a[i+1] 
+10

이고 [[enumerate'] (http://docs.python.org/library/functions.html#enumerate) – SilentGhost

+5

열거 형은 스텝 크기를 지정할 수 없다는 것을 알아 두십시오. 하지만 당신은'for i, 열거 형 (a [:: 2]) : '을 사용할 수 있습니다. 여전히 dict 생성자가 당신을 위해 대부분의 작업을 수행 할 수 있기 때문에 아직 만족하지 못합니다. –

+0

@SilentGhost, gnibbler : 내 시야를 넓혀 주셔서 감사합니다! 나는 그것을 가능한 한 많이 통합 할 것입니다! – sahhhm

33

또 다른 옵션 (알렉스 마르 텔리 https://stackoverflow.com/a/2597178/104264의 제공) :

a = ['bi','double','duo','two'] 
: 또한이있는 경우

dict(x[i:i+2] for i in range(0, len(x), 2)) 

그리고 원하는 값 (이 경우 2)을 키 입력하는 목록의 각 요소) :

{'bi':2,'double':2,'duo':2,'two':2} 

당신은 사용할 수 있습니다

>>> dict((k,2) for k in a) 
{'double': 2, 'bi': 2, 'two': 2, 'duo': 2} 
+1

가장 좋은 대답은 – ucefkh

+1

우수, 감사합니다! –

+1

파이썬 3 전용입니까? – Tagar

0

나는 확실하지 않다이 파이썬이지만, 파이썬에서

def alternate_list(a): 
    return a[::2], a[1::2] 

key_list,value_list = alternate_list(a) 
b = dict(zip(key_list,value_list)) 
-9

을 작동하는 것 같다 매우 간단 경우 :

dict(a) 
+4

' 그게 효과 있다고 생각하지 않습니다. – Mike

12

dict comprehension fo를 사용할 수 있습니다. R이 아주 쉽게 :

a = ['hello','world','1','2'] 

my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0} 

이 아래 for 루프에 해당 : 또한 (사전에, 여기에 변환을 나열하는 문자열 다음 변환)과 같이 그것을 할 수

my_dict = {} 
for index, item in enumerate(a): 
    if index % 2 == 0: 
     my_dict[item] = a[index+1] 
1

string_list = """ 
    Hello World 
    Goodbye Night 
    Great Day 
    Final Sunset 
    """.split() 

    string_list = dict(zip(string_list[::2],string_list[1::2])) 

    print string_list 
1

Perl에서 해시를위한 기본 이니셜 라이저 인이 변환에 대해 한 줄짜리 코드도 관심이 있습니다.

예외적으로 포괄적 인 대답이 스레드에서 주어진다 -

내 하나의 내가) 파이썬 안돼서, Python 2.7 Generator Expressions를 사용하여, 다음과 같습니다

dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))

5

나는 당신의 명부가 단지 2 품목 인 경우에 나는 아주 차가운 것을 찾아내는 무언가이다 긴 S :

ls = ['a', 'b'] 
dict([ls]) 
>>> {'a':'b'} 

가 기억

이, 딕셔너리는 반복 가능한 각 항목 자체가 정확히 두 개의 객체를 가진 반복 가능해야합니다 경우 반복 가능을 포함하는 모든 반복자를 받아들입니다.

+0

빠르고 간단하게 목록에 두 개 이상의 항목이 들어 있으면 dict ([ls]) 대신 dict (ls)를 사용하면됩니다. 예를 들어 if ls = [ 'a', 'b', 'c', 'd'] then dict (ls) –

3

당신은 여분의 배열을 만들지 않고 꽤 빨리 그것을 할 수 있으므로이 경우에도 매우 큰 배열을 위해 작동합니다

dict(izip(*([iter(a)]*2))) 

당신이 발전기 a이있는 경우, 더 나은 :

dict(izip(*([a]*2))) 

여기 런 다운 :

iter(h) #create an iterator from the array, no copies here 
[]*2  #creates an array with two copies of the same iterator, the trick 
izip(*()) #consumes the two iterators creating a tuple 
dict()  #puts the tuples into key,value of the dictionary 
-1
#work~ 
` 
a = ['Openstack','Puppet','Python'] 
b = {} 
c = 0 
for v in a: 
    b[v] = c 
    c+=1 
print b 
코드 아래

`

+1

이것은 질문에서 요구하지 않습니다. – cpburnz

0

시도 :의

>>> d2 = dict([('one',1), ('two', 2), ('three', 3)]) 
    >>> d2 
     {'three': 3, 'two': 2, 'one': 1} 
관련 문제