목록 이해력이있는 사전 만들기


1278

나는 파이썬 목록 이해 구문을 좋아합니다.

사전을 만드는 데에도 사용할 수 있습니까? 예를 들어, 키와 값 쌍을 반복함으로써 :

mydict = {(k,v) for (k,v) in blah blah blah}  # doesn't work

관련 : collections.Counter물건을 세는 데 필요한 특수한 유형의 사전 : 사전을 사용하여 목록의 항목 수
smci

답변:


1897

Python 2.7 및 3부터 dict comprehension 구문을 사용해야 합니다 .

{key: value for (key, value) in iterable}

Python 2.6 및 이전 버전에서 dict내장은 반복 가능한 키 / 값 쌍을 수신 할 수 있으므로 목록 이해 또는 생성기 표현식을 전달할 수 있습니다. 예를 들면 다음과 같습니다.

dict((key, func(key)) for key in keys)

그러나 이미 반복 가능한 키 및 / 또는 val이 있다면 이해를 전혀 사용할 필요가 없습니다. 가장 간단한 것은 dict내장을 직접 호출하는 것입니다 .

# consumed from any iterable yielding pairs of keys/vals
dict(pairs)

# "zipped" from two separate iterables of keys/vals
dict(zip(list_of_keys, list_of_values))

1
단어 목록 [ 'cat', 'dog', 'cat']의 사례가 있고 키를 단어로, 값을 개수로 사용하여 받아쓰기를하려면 어떻게해야합니까? 이를위한 짧은 효율적인 구문이 있습니까?
cryanbhu

@cryanbhu 만약 당신이 의미하는 것이리스트에서 주어진 요소의 반복을 세는 것이라면
fortran


57

사실, 이미 일종의 매핑을 이해하고 있다면 dict 생성자가 당신을 위해 은혜롭게 수행하는 경우 iterable을 반복 할 필요조차 없습니다.

>>> ts = [(1, 2), (3, 4), (5, 6)]
>>> dict(ts)
{1: 2, 3: 4, 5: 6}
>>> gen = ((i, i+1) for i in range(1, 6, 2))
>>> gen
<generator object <genexpr> at 0xb7201c5c>
>>> dict(gen)
{1: 2, 3: 4, 5: 6}

40

Python 2.7에서는 다음과 같이 진행됩니다.

>>> list1, list2 = ['a', 'b', 'c'], [1,2,3]
>>> dict( zip( list1, list2))
{'a': 1, 'c': 3, 'b': 2}

그들을 압축 !


11
이것은 질문을 전혀 다루지 않습니다.
Jean-François Corbett

32

파이썬에서 목록 이해력을 가진 사전 만들기

나는 파이썬 목록 이해 구문을 좋아합니다.

사전을 만드는 데에도 사용할 수 있습니까? 예를 들어, 키와 값 쌍을 반복함으로써 :

mydict = {(k,v) for (k,v) in blah blah blah}

"dict comprehension"이라는 구절을 찾고 있습니다. 실제로는 다음과 같습니다.

mydict = {k: v for k, v in iterable}

blah blah blah두 튜플의 반복 가능하다고 가정하면 너무 가깝습니다. 그런 "블라"를 만들어 봅시다 :

blahs = [('blah0', 'blah'), ('blah1', 'blah'), ('blah2', 'blah'), ('blah3', 'blah')]

독해 이해 구문 :

이제 구문은 매핑 부분입니다. 이것을 dict이해하는 대신 set이해하는 것은 (의사 코드 근사치 인) 콜론입니다. :아래와 같이 :

mydict = {k: v for k, v in blahs}

그리고 우리는 그것이 효과가 있었고 Python 3.7부터 삽입 순서를 유지해야한다는 것을 알았습니다.

>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah2': 'blah', 'blah3': 'blah'}

파이썬 2에서 3.6까지는 순서가 보장되지 않았습니다.

>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah3': 'blah', 'blah2': 'blah'}

필터 추가 :

모든 이해에는 임의의 식을 제공 할 수있는 매핑 구성 요소와 필터링 구성 요소가 있습니다.

따라서 필터 부분을 끝에 추가 할 수 있습니다.

>>> mydict = {k: v for k, v in blahs if not int(k[-1]) % 2}
>>> mydict
{'blah0': 'blah', 'blah2': 'blah'}

여기서 우리는 키와 값을 매핑하기 전에 데이터를 필터링하기 위해 마지막 문자를 2로 나눌 수 있는지 테스트하고 있습니다.


23

Python 버전 <2.7 (RIP, 2010 년 7 월 3 일-2019 년 12 월 31 일) , 다음을 수행하십시오.

d = dict((i,True) for i in [1,2,3])

파이썬 버전> = 2.7, 아래를 수행하십시오 :

d = {i: True for i in [1,2,3]}

22

key_list목록과 값 목록을 반복하려면 @fortran의 답변에 추가하십시오 value_list.

d = dict((key, value) for (key, value) in zip(key_list, value_list))

또는

d = {(key, value) for (key, value) in zip(key_list, value_list)}

6

dict comprehension을 사용한 사전 작성의 또 다른 예는 다음과 같습니다.

여기서 내가 할 일은 각 쌍이있는 알파벳 사전을 만드는 것입니다. 영문자와 영어 알파벳의 해당 위치입니다.

>>> import string
>>> dict1 = {value: (int(key) + 1) for key, value in 
enumerate(list(string.ascii_lowercase))}
>>> dict1
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 
'k': 11, 'j': 10, 'm': 13, 'l': 12, 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 
19, 'r': 18, 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26}
>>> 

여기에 열거를 사용하여 알파벳 목록과 색인을 목록에서 가져오고 알파벳과 색인을 바꿔 사전의 키 값 쌍을 생성하십시오.

희망은 사전 comp에 대한 좋은 아이디어를 제공하고 코드를 압축하기 위해 더 자주 사용하도록 권장합니다.


1
좋은 답변-단순화 :d = {k: v+1 for v, k in enumerate(string.ascii_lowercase)}
johnnydrama

4

이 시도,

def get_dic_from_two_lists(keys, values):
    return { keys[i] : values[i] for i in range(len(keys)) }

국가수도에 두 개의 목록이 있다고 가정합니다.

country = ['India', 'Pakistan', 'China']
capital = ['New Delhi', 'Islamabad', 'Beijing']

그런 다음 두 목록에서 사전을 작성하십시오.

print get_dic_from_two_lists(country, capital)

출력은 다음과 같습니다

{'Pakistan': 'Islamabad', 'China': 'Beijing', 'India': 'New Delhi'}

9
당신은 zip을 사용할 수 있었다
Andre Simon

2
>>> {k: v**3 for (k, v) in zip(string.ascii_lowercase, range(26))}

파이썬은 dict comprehensions을 지원하여 런타임에 유사한 간결한 구문을 사용하여 사전 작성을 표현할 수 있습니다.

사전 이해는 {key : value for (key, value) in iterable} 형식을 취합니다. 이 구문은 Python 3에서 도입되었으며 Python 2.7까지 백 포트되었으므로 설치 한 Python 버전에 관계없이 사용할 수 있습니다.

표준 예제는 두 개의 목록을 가져 와서 첫 번째 목록의 각 위치에있는 항목이 키가되고 두 ​​번째 목록의 해당 위치에있는 항목이 값이되는 사전을 작성하는 것입니다.

이 이해에 사용되는 zip 함수는 튜플의 반복자를 반환합니다. 여기서 튜플의 각 요소는 각 입력 반복 가능 항목의 동일한 위치에서 가져옵니다. 위의 예에서 반환 된 반복자는 튜플 (“a”, 1), (“b”, 2) 등을 포함합니다.

산출:

{ 'i': 512, 'e': 64, 'o': 2744, 'h': 343, 'l': 1331, 's': 5832, 'b': 1, 'w': 10648, ' c ': 8,'x ': 12167,'y ': 13824,'t ': 6859,'p ': 3375,'d ': 27,'j ': 729,'a ': 0,'z ' : 15625, 'f': 125, 'q': 4096, 'u': 8000, 'n': 2197, 'm': 1728, 'r': 4913, 'k': 1000, 'g': 216 , 'v': 9261}


2

이 코드는 사용할 수있는 값이 다른 여러 목록에 대해 목록 이해를 사용하여 사전을 작성합니다. pd.DataFrame()

#Multiple lists 
model=['A', 'B', 'C', 'D']
launched=[1983,1984,1984,1984]
discontinued=[1986, 1985, 1984, 1986]

#Dictionary with list comprehension
keys=['model','launched','discontinued']
vals=[model, launched,discontinued]
data = {key:vals[n] for n, key in enumerate(keys)}

enumerate목록과 일치하도록 전달 n됩니다.valskey


1

다른 예를 들기 위해. 다음 목록이 있다고 상상해보십시오.

nums = [4,2,2,1,3]

그리고 키가 인덱스이고 값이 목록의 요소 인 dict로 바꾸고 싶습니다. 다음 코드 줄을 사용하면됩니다.

{index:nums[index] for index in range(0,len(nums))}

0

각 쌍에 대해 새 dict를 만들어 이전 dict와 병합 할 수 있습니다.

reduce(lambda p, q: {**p, **{q[0]: q[1]}}, bla bla bla, {})

분명히이 접근법은 reduce에서 필요합니다 functools.


동일한 아이디어 : 감소 (람다 P, Q : {이 ** P ** 딕셔너리 ([Q])} BLA BLA BLA, {})
마흐무드 칼리드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.