2010-12-01 6 views
48

나는 아래의 사전이 있습니다사전에 색인을 생성하는 방법은 무엇입니까?

colors = { 
    "blue" : "5", 
    "red" : "6", 
    "yellow" : "8", 
} 

을 어떻게 인덱스 사전의 첫 번째 항목을합니까?

colors[0]은 명백한 이유 때문에 KeyError을 반환합니다.

+3

"첫 번째"무엇을 의미합니까? 사전에는 순서가 없습니다. –

답변

62

사전은 파이썬에서 정렬되지 않습니다. 항목의 순서를 신경 쓰지 않고 색인을 통해 키나 값에 액세스하려는 경우 d.keys()[i]d.values()[i] 또는 d.items()[i]을 사용할 수 있습니다. 이 메서드는 각각 모든 키, 값 또는 항목의 목록을 만듭니다. 따라서 한 번 이상 필요하면 성능 향상을 위해 변수에 목록을 저장하십시오.)

항목, 파이썬 2.7부터는 collections.OrderedDict을 사용할 수 있습니다. 또는 키로 액세스 할 필요가없는 경우 쌍 목록을 사용하십시오.

(왜 그런 식으로 당신의 숫자 문자열입니까?)

+2

파이썬 2에서는'd.keys() [0]'대신'd.iterkeys(). next()'를 사용하여 키 하나를 지우지 않고 검사 할 수 있습니다. 사전이 거대한 경우 성능면에서 큰 차이를 만듭니다. 값과 항목도 마찬가지입니다. Python 2.7에서는 [dict view objects]도 사용할 수 있습니다. (http://docs.python.org/2/library/stdtypes.html#dictionary-view-objects) – simleo

+10

Python 3에서 이러한 호출은 뷰를 반환합니다. 실제 목록이므로 list() 호출에서 래핑해야합니다. 그렇지 않으면 "TypeError : 'dict_values'객체가 인덱싱을 지원하지 않습니다."라는 메시지가 표시됩니다. 이것을 참조하십시오 S.O. 질문 : http://stackoverflow.com/questions/17431638/get-typeerror-dict-values-object-does-not-support-indexing-when-using-python – stifin

+1

수정 사항 중 하나입니다. 색인을 생성 할 수 없습니다. items(), 적어도 파이썬 3에는 없다. –

1

dict은 정렬되지 않으므로 사용자가 수 없습니다. .popitem()을 사용하여 임의의 항목을 가져올 수 있지만 그 항목은 dict에서 제거됩니다.

+0

'next (iter (d.items()))'('.iteritems()'는 파이썬 2에서 임의의 항목을 제공합니다 (내 테스트에서와 동일합니다. popitem은 이것을 사용하여 구현할 수 있습니다) 항목을 제거하지는 않습니다. – delnan

3

주문한 사전이 필요하면 odict을 사용할 수 있습니다.

+0

odict는 keys(), values ​​() 또는 items()에 대한 색인 생성을 지원하지 않습니다. – Konstantin

0

사전은 목록이 아닙니다.

목록에서 원하는 값을 얻으려면 enter foo[0] here을 입력하면됩니다.

dicts에는 .value 및 .keys() 함수가 있습니다.

또한 dict를 반복 할 때마다 try/except를 사용하는 것이 더 좋습니다.

3

실제로 제가 정말로 도움이되는 새로운 솔루션을 발견했습니다. 특히 목록이나 데이터 세트의 특정 값의 색인에 관심이 있다면 사전 색인의 값을 설정할 수 있습니다! :

그냥 시계 :

list = ['a', 'b', 'c'] 
dictionary = {} 
counter = 0 
for i in list: 
    dictionary[i] = counter 
    counter += 1 

print(dictionary) # dictionary = {'a':0, 'b':1, 'c':2} 

이제 사전의 요소를 해결

3

(훨씬 빠른 일명) 일정 시간에 항목을 나귀에 앉아처럼 인덱스를 당길 수 HashMaps을의 힘을 통해 타고 즐기십시오.이제

dic = {1: "a", 2: "aa", 3: "aaa"} 

내가 dic[10] = "b"처럼 가면 생각이 있다면

파이썬 원칙적으로

사전

orderless이며, 다음이 항상

dic = {1:"a",2:"aa",3:"aaa",10:"b"} 
처럼 추가하지 않습니다

와 같을 수 있습니다.
dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"} 

또는

dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"} 

또는

dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"} 

또는 그러한 조합

.

엄지 손가락 규칙은 입니다. 문법입니다. 주문 번호입니다. 사람이 여전히이 질문을보고하면

21

는 현재 허용 대답은 이제 구식이되어

사전의이 순서 보존을, 즉 그들이 지금 collections.OrderedDict들에 사용되는 것과 똑같이 행동입니다 파이썬 3.6 이후

. 불행하게도, 여전히 사전의 keys()/values()에 인덱스에는 전용 방법이 없기 때문에 사전에 최초의 키/값 (이 키가로 볼 인스턴스화 방지 대안으로

first_key = list(colors.keys())[0] 
first_val = list(colors.values())[0] 

또는으로 수행 할 수 있습니다하기 목록) :

def get_first_key(dictionary): 
    for key in dictionary.keys(): 
     return key 

first_key = get_first_key(colors) 
first_val = colors[first_key] 

당신이 n 번째 키가 필요한 경우는 다음과 유사

def get_nth_key(dictionary, n=0): 
    if n < 0: 
     n += len(dictionary) 
    for i, key in enumerate(dictionary.keys()): 
     if i == n: 
      return key 
    raise IndexError("dictionary index out of range") 
관련 문제