[python] 사전에 색인을 생성하는 방법은 무엇입니까?

아래에 사전이 있습니다.

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

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

colors[0]KeyError명백한 이유로를 반환합니다 .



답변

사전은 Python 3.6 이하의 Python 버전에서 정렬되지 않습니다. 당신이 항목의 순서에 관심 어쨌든 인덱스로 키 또는 값에 액세스하지 않으려면, 당신이 사용할 수있는 d.keys()[i]d.values()[i]d.items()[i]. (이러한 메서드는 Python 2.x에서 모든 키, 값 또는 항목의 목록을 생성합니다. 따라서 한 번 더 필요한 경우 목록을 변수에 저장하여 성능을 향상시킵니다.)

항목의 순서에 관심이 있다면 Python 2.7부터 collections.OrderedDict. 또는 쌍 목록 사용

l = [("blue", "5"), ("red", "6"), ("yellow", "8")]

키로 액세스 할 필요가없는 경우. (왜 당신의 숫자는 문자열입니까?)

Python 3.7에서는 일반 사전이 정렬되어 있으므로 OrderedDict더 이상 사용할 필요가 없습니다 (하지만 여전히 사용할 수 있습니다. 기본적으로 동일한 유형입니다). Python 3.6의 CPython 구현에는 이미 해당 변경 사항이 포함되어 있지만 언어 사양의 일부가 아니기 때문에 Python 3.6에서는이를 신뢰할 수 없습니다.


답변

여전히이 질문을보고있는 사람이 있다면 현재 허용되는 답변은 이제 구식입니다.

Python 3.7 * 이후 사전은 순서를 유지합니다 . 즉, 이제는 collections.OrderedDict예전 처럼 정확하게 작동 합니다. 불행하게도,에 인덱스 전담 방법은 여전히 존재 keys()/ values()사전의 때문에 사전에 최초의 키 / 값으로 수행 할 수 있습니다지고,

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

또는 (이렇게하면 키보기를 목록으로 인스턴스화하지 않음) :

def get_first_key(dictionary):
    for key in dictionary:
        return key
    raise IndexError

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

n-th 키 가 필요한 경우 비슷하게

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

(* CPython 3.6에는 이미 정렬 된 dict가 포함되어 있지만 이것은 구현 세부 사항 일뿐입니다. 언어 사양에는 3.7 이후의 정렬 된 dict가 포함되어 있습니다.)


답변

사전의 요소를 다루는 것은 당나귀에 앉아 타고 즐기는 것과 같습니다.

Python의 규칙에 따라 사전은 순서가 없습니다.

있는 경우

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

이제 내가 이렇게 가면 dic[10] = "b"항상 이렇게 추가되지 않을 것이라고 가정하십시오.

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"}

또는 그러한 조합.

그래서 경험의 법칙은 DICTIONARY질서없다는 것입니다 !


답변

정렬 된 사전이 필요한 경우 odict 를 사용할 수 있습니다 .


답변

실제로 저에게 도움이되는 새로운 솔루션을 찾았습니다. 목록이나 데이터 세트에서 특정 값의 인덱스에 특히 관심이 있다면 사전 값을 해당 인덱스로 설정할 수 있습니다! :

그냥 봐:

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}

이제 해시 맵의 힘을 통해 항목 색인을 일정한 시간에 가져올 수 있습니다 (훨씬 더 빠름).


답변

오, 그것은 힘든 일입니다. 기본적으로 여기에있는 것은 각 항목에 대한 두 개의 값입니다. 그런 다음 번호를 키로 사용하여 전화를 겁니다. 안타깝게도 값 중 하나가 이미 키로 설정되어 있습니다!

이 시도:

colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}

이제 목록처럼 인덱싱 된 것처럼 번호로 키를 호출 할 수 있습니다. 목록 내 위치별로 색상과 번호를 참조 할 수도 있습니다.

예를 들면

colors[1][0]
// returns 'blue'

colors[3][1]
// returns '8'

물론 각 색상이 어떤 위치에 있는지 추적하는 또 다른 방법을 찾아야합니다. 각 색상의 키를 값으로 저장하는 또 다른 사전을 가질 수 있습니다.

colors_key = { ‘파란색’: 1, ‘빨간색’: 6, ‘일 로우’: 8}

그런 다음 필요한 경우 색상 키도 조회 할 수 있습니다.

colors [colors_key [ ‘blue’]] [0]은 ‘blue’를 반환합니다.

그런 것.

그런 다음 필요한 경우 숫자 값을 키로 사용하여 항상 색상을 조회하는 데 사용할 수 있도록 딕셔너리를 만들 수 있습니다.

값 = {5 : [1, ‘파란색’], 6 : [2, ‘빨간색’], 8 : [3, ‘노란색’]}

그러면 (colors [colors_key [values ​​[5] [1]]] [0])은 ‘blue’를 반환합니다.

또는 목록 목록을 사용할 수 있습니다.

행운을 빕니다!


답변

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