파이썬에서 목록을 사전으로 변환


190

a파이썬에 항목이 사전에 편리하게 매핑 되는 목록이 있다고 가정 해 봅시다 . 각 짝수 요소는 사전의 키를 나타내며 다음 홀수 요소는 값입니다.

예를 들어

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

그리고 그것을 사전으로 변환하고 싶습니다 b.

b['hello'] = 'world'
b['1'] = '2'

이것을 달성하는 문법적으로 가장 깨끗한 방법은 무엇입니까?


답변:


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

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

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

파이썬 3에서는 dict comprehension을 사용할 수도 있지만 아이러니하게도 가장 간단한 방법은 range()and 와 함께 len()할 것이라고 생각합니다.이 코드는 보통 코드 냄새입니다.

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

따라서 iter()/izip()주석에서 EOL 메모 zip()가 이미 Python 3에서 게으 르기 때문에이 방법은 여전히 ​​Python 3에서 가장 Pythonic 일 것입니다 izip().

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

한 줄로 원하면 세미콜론을 속이고 사용해야합니다. ;-)


9
... 또는 간단히 zip(i, i)파이썬 3에서는 zip()반복자를 반환합니다.
Eric O Lebigot

5
파이썬 2.7.3에는 dict 이해력이 있습니다.
user1438003

56

간단한 답변

또 다른 옵션 (의 호의 알렉스 마르 텔리 - 소스 ) :

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

관련 메모

이것이 있다면 :

a = ['bi','double','duo','two']

그리고 당신은 이것을 원합니다 (목록 키의 각 요소는 주어진 값 (이 경우 2)) :

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

당신이 사용할 수있는:

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

2
이것은 Python 3에만 해당됩니까?
Tagar

2
사용하십시오 fromkeys. >>> dict.fromkeys(a, 2) {'bi': 2, 'double': 2, 'duo': 2, 'two': 2}
Gdogg

1
이것은 질문이하는 것 이외의 일을하고 있습니다.
ozn

17

이를 위해 dict 이해력을 매우 쉽게 사용할 수 있습니다.

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]

10

내가 꽤 멋진 것을 발견 한 것은 목록이 2 항목 밖에없는 경우입니다.

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

dict은 iterable의 각 항목 자체가 정확히 두 개의 오브젝트가있는 iterable이어야하는 iterable을 포함하는 모든 iterable을 허용합니다.


목록에 둘 이상의 항목이 포함 된 경우 추가하려면 dict ([ls]) 대신 dict (ls)를 사용하십시오. 예를 들어 ls = [ 'a', 'b', 'c', 'd'] 인 경우 dict (ls)
ankit tyagi

1
멋지고 매끈합니다. '반복 가능 항목의 각 항목 자체는 정확히 두 개의 오브젝트가있는 반복 가능해야합니다.' 여기서 중요한 사실입니다.
Abhijeet

4

가장 파이썬이 아닐 수도 있지만

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


5
열거 형을 사용하면 단계 크기를 지정할 수 없지만을 사용할 수 있습니다 for i, key in enumerate(a[::2]):. dict 생성자가 당신을 위해 대부분의 작업을 수행 할 수 있기 때문에 여전히 비유 론적입니다
John La Rooy

@SilentGhost, gnibbler : 내 시야를 넓혀 주셔서 감사합니다! 앞으로 가능한 한 많이 포함시킬 것입니다!
sahhhm

@gnibbler : for i, key in enumerate(a[::2]):접근 방식 에 대해 좀 더 설명해 주 시겠습니까? 결과 쌍 값은 0 helloand이며 1 1, 값 을 사용하여 생성하는 방법이 확실하지 않습니다 {'hello':'world', '1':'2'}.
martineau

1
@ martineau, 당신은 맞습니다. 난 내가이 의미가 생각합니다enumerate(a)[::2]
존 라 Rooy을

4

추가 배열을 만들지 않고도 꽤 빨리 할 수 ​​있으므로 매우 큰 배열에서도 작동합니다.

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

이것은 동일한 키와 값 쌍을 가진 사전을 만들 것입니다 ( {'hello':'hello','world':'world','1':'1','2':'2'})
mik

아니, 모두 잘 작동합니다. 더 자세히 읽으십시오. "제너레이터가 있다면 ..."제너레이터가 없다면 첫 번째 줄만 사용하십시오. 두 번째는 대부분의 경우처럼 목록 대신 생성기가있는 경우 유용한 대안입니다.
topkara

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


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))

0

아래 코드를보십시오 :

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

0

이 방법을 사용하여 키와 값을 다른 목록에 저장 한 다음 dict 방법을 사용할 수 있습니다

data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4']

keys=[]
values=[]
for i,j in enumerate(data):
    if i%2==0:
        keys.append(j)
    else:
        values.append(j)

print(dict(zip(keys,values)))

산출:

{'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.