2013-01-24 4 views
289

파이썬에서 키에 대한 사전 이해력을 만들 수 있습니까? 우리는 목록 이해력이 단축 될 수 있습니다파이썬 사전 이해

l = [] 
for n in range(1, 11): 
    l.append(n) 

: l = [n for n in range(1, 11)] 지능형리스트없이

는, 다음과 같이 사용할 수 있습니다.

그러나 사전의 키를 동일한 값으로 설정한다고 가정 해보십시오. 내가 할 수있는 :

d = {} 
for n in range(1, 11): 
    d[n] = True # same value for each 

나는 이것을 시도했다 :

d = {} 
d[i for i in range(1, 11)] = True 

그러나, 나는이 forSyntaxError를 얻을.

또한

(나는이 부분이 필요하지만, 그냥 궁금하지 않음),이 같은 다른 값의 무리 사전의 키를 설정할 수 있습니다

d = {} 
for n in range(1, 11): 
    d[n] = n 

는 사전 이해와이 가능 ?

d = {} 
d[i for i in range(1, 11)] = [x for x in range(1, 11)] 

이것은 또한 forSyntaxError를 발생시킵니다.

+1

향후 독자 정보 : NumPy 배열을 사용하면 여러 요소를 하나의 값이나 값 목록으로 설정할 수 있습니다. NumPy를 사용할 이유가 없다면이 기능만으로는 가치가 없을 것입니다. –

답변

390

dictionary comprehensions in Python 2.7+이 있지만 시도하는 방식대로 작동하지 않습니다. 목록 이해와 마찬가지로 사전을 만듭니다. 기존 사전에 키를 추가하는 데 사용할 수 없습니다. 또한 원하는 경우 더미 값을 지정할 수도 있지만 키와 값을 지정해야합니다.

>>> d = {n: n**2 for n in range(5)} 
>>> print d 
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16} 

True로 그들 모두를 설정하려면

는 :

>>> d = {n: True for n in range(5)} 
>>> print d 
{0: True, 1: True, 2: True, 3: True, 4: True} 

당신은 무엇을 요구하는 것으로 보인다 것은 기존의 사전을 한 번에 여러 개의 키를 설정하는 방법입니다. 직접적인 지름길은 없습니다. 이미 보여준 것처럼 반복하거나 사전 독해를 사용하여 새로운 값으로 새 dict을 만든 다음 oldDict.update(newDict)을 사용하여 새 값을 이전 dict에 병합 할 수 있습니다.

+10

FWIW,'dict.update'는'dict' 생성자와 마찬가지로 키 - 값 쌍의 반복 가능을 받아 들일 수 있습니다 – mgilson

+1

모든 값이 같은 사전을 만들려면'dict.fromkeys()'를 사용하십시오. 그래서 모든 값을'True'로 설정하려면'dict.fromkeys (range (5), True)'를 사용하십시오. * 값을 복사 할 수 없으므로 값을 변경할 수 있으면이 값을 사용하지 않는 것이 좋습니다. 모든 키간에 공유됩니다. –

+1

참고 : 키는 메소드의 결과 일 수도 있습니다.'{n * 2 : n for n (3)} => {0 : 0, 2 : 1, 4 : 2}'의 결과 일 수 있습니다. 둘 다 같은 표현으로 할 수 있습니다 :'{n * 2 : n * 3 (range) (3)} => {0 : 0, 2 : 3, 4 : 6}'. – Zaaier

136

당신은 dict.fromkeys 클래스 메소드를 사용할 수 있습니다 ...

>>> dict.fromkeys(range(1, 11), True) 
{1: True, 2: True, 3: True, 4: True, 5: True, 6: True, 7: True, 8: True, 9: True, 10: True} 

이 모든 키가 같은 값에 매핑 사전을 만들 수있는 가장 빠른 방법입니다. 당신이 실제로 모든 키를 초기화 필요하는 defaultdict뿐만 아니라 유용 할 수 있습니다 할 경우

d = dict.fromkeys(range(10), []) 
d[1].append(2) 
print(d[2]) # ??? 

:

하지만 가변 객체와이를 사용하여주의

from collections import defaultdict 
d = defaultdict(lambda: True) 

두 번째 부분에 대답하려면 필요한 부분 만 받아들입니다.

{k: k for k in range(10)} 

또는 python2.6 0 : 당신이 __missing__를 오버라이드 (override)하는 경우

dict((k, k) for k in range(10)) 

또한 defaultdict처럼 다소 작동 딕셔너리의 영리한 서브 클래스를 만들 수 있습니다

>>> class KeyDict(dict): 
... def __missing__(self, key): 
...  #self[key] = key # Maybe add this also??? 
...  return key 
... 
>>> d = KeyDict() 
>>> d[1] 
1 
>>> d[2] 
2 
>>> d[3] 
3 
>>> print(d) 
{} 

깔끔한.

+0

'd = defaultdict (lambda : True)'의 경우, 람다는 True가 아니기 때문에 필요하지 않습니다. – rhbvkleef

21
>>> {i:i for i in range(1, 11)} 
{1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10} 
10

사용 DICT() 튜플의리스트에이 솔루션은

i_s = range(1, 11) 
x_s = range(1, 11) 
# x_s = range(11, 1, -1) # Also works 
d = dict([(i_s[index], x_s[index],) for index in range(len(i_s))]) 
+10

부수적으로, 이것은 'd = dict (zip (i_s, x_s))'와 동일한 의미입니다. – mgilson

-2

당신이 해시 수 없습니다 그래서 그들이 같은 길이만큼, 각 목록에서 임의의 값을 가질 수 있습니다 그런 목록. 는 튜플

d[tuple([i for i in range(1,11)])] = True 
+6

이것은 OP가 원했던 바를 전혀하지 않습니다 ... –

6

지능형리스트의 주요 목적은 변경하거나 원래의 목록을 파괴하지 않고 다른 하나를 기반으로 새로운 목록을 만드는 것입니다을 사용하는 대신에 이것을 시도. 대신 글을 쓰는

l = [] 
    for n in range(1, 11): 
     l.append(n) 

또는

l = [n for n in range(1, 11)] 

당신이 그것을 통해 반복, 새 목록을 만드는 두 정상 코드 블록에서 전용

l = range(1, 11) 

를 작성해야 각 요소를 반환하는 것입니다. 그것은 단지리스트 사본을 만드는 비싼 방법 일뿐입니다. 당신은 구문 에러를 수신하고

old_dict = {'a': 1, 'c': 3, 'b': 2} 
    new_dict = { key:'your value here' for key in old_dict.keys()} 

당신이

d = {} 
    d[i for i in range(1, 11)] = True 

을 쓸 때 때문에 :

이 작업을 수행, 다른 딕셔너리에 따라 동일한 값으로 설정 모든 키와 새 사전을 얻으려면 기본적으로 다음과 같이 말합니다. "범위 (1, 11)의 i에 대해 내 키를"True "로 설정하고 범위 (1, 11)의 i에 대해"i는 유효한 키가 아니며 구문 오류 일뿐입니다. dicts 키로 목록을 지원하는 경우

d[[i for i in range(1, 11)]] = True 

하지

d[i for i in range(1, 11)] = True 

같은 것을 할 것입니다하지만 당신은 DICT 키로 사용할 수 없도록 목록, 해쉬 없습니다.

16

두 개의 iterables가 있고 키와 다른 값에 해당하는 경우 다음과 같이 할 수 있으므로 @mgilson 주석을 정말 좋아합니다.

keys = ['a', 'b', 'c'] 
values = [1, 2, 3] 
d = dict(zip(keys, values)) 

주는

D = { '은'1 ', B': 2, 'c'는 3}

9

단어의 발생을 계산의 예를 고려 목록의 사전 이해

my_list = ['hello', 'hi', 'hello', 'today', 'morning', 'again', 'hello'] 
my_dict = {k:my_list.count(k) for k in my_list} 
print(my_dict) 

를 사용하여 그리고 그 결과는

입니다
{'again': 1, 'hi': 1, 'hello': 3, 'today': 1, 'morning': 1} 
+0

이것은 가장 흥미롭지 만 흥미롭지는 않지만 'hello'와 같은 키를 여러 번 세게되므로 – FuriousGeorge