prosource

어떻게 사전을 색인화합니까?

probook 2023. 7. 17. 21:13
반응형

어떻게 사전을 색인화합니까?

아래에 사전이 있습니다.

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

사전의 첫 번째 항목을 색인화하려면 어떻게 해야 합니까?

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

여전히 이 질문을 보고 있는 사람이 있다면, 현재 받아들여지고 있는 답변은 이제 구식입니다.

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 키, 그 에 유사하게 , 지로가마찬

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

Cython 3.6에는 이미 삽입 순서 딕트가 포함되어 있었지만, 이는 구현 세부 사항에 불과했습니다.언어 사양에는 3.7 이상의 삽입 순서 딕트가 포함되어 있습니다.

사전은 Python 3.6 이하의 Python 버전에서 정렬되지 않습니다. 키 수 .d용사를 keys = list(d).keys[i] 그고관값된련과 관련된 .d[keys[i]].

Python 2.7부터 항목 순서가 중요하다면 를 사용할 수 있습니다. 또는 쌍 목록을 사용합니다.

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

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

3되므로 Python 3.7을 OrderedDict더 이상 사용할 수 없습니다. 기본적으로 동일한 유형입니다.Python 3.6의 CPython 구현에는 이미 이러한 변경 사항이 포함되어 있지만 언어 사양의 일부가 아니기 때문에 Python 3.6에서는 이 변경 사항에 의존할 수 없습니다.

순서가 정해진 사전이 필요하다면, 당신은 odict를 사용할 수 있습니다.

오, 그것은 어려운 것입니다.여기에 있는 것은 기본적으로 각 항목에 대한 두 개의 값입니다.그러면 당신은 번호를 열쇠로 그들에게 전화를 걸려고 합니다.안타깝게도 값 중 하나가 이미 키로 설정되어 있습니다!

사용해 보십시오.

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

이제 목록처럼 색인화된 것처럼 번호별로 키를 호출할 수 있습니다.또한 목록 내 위치를 기준으로 색상과 번호를 참조할 수 있습니다.

예를들면,

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

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

물론, 여러분은 각 색이 어떤 위치에 있는지 추적할 다른 방법을 생각해내야 할 것입니다.각 색상의 키를 값으로 저장하는 다른 사전을 만들 수도 있습니다.

colors_key = {'blue': 1, 'red': 6, '옐로우': 8}

그러면, 필요할 경우 색상 키도 조회할 수 있습니다.

colors[color_key['blue']][0]는 'blue'를 반환합니다.

그런 거.

그리고 나서, 여러분이 그것을 하는 동안, 여러분은 숫자 값을 열쇠로 사용하여 받아쓰기를 할 수 있습니다. 그래서 여러분은 필요할 때마다 그것들을 사용해서 여러분의 색을 찾을 수 있습니다.

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

그러면 (colors[colors[colors_key[values[5][1]]]][0]) '파란색'을 반환합니다.

아니면 목록을 사용할 수도 있습니다.

행운을 빕니다.

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

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

또는 그와 같은 조합.

그래서 경험의 법칙은 사전순서가 없다는 것입니다!

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

그냥 보세요:

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}

이제 해시 맵의 기능을 통해 항목을 일정한 시간 내에 추출할 수 있습니다(즉, 훨씬 더 빠른 속도).

인덱싱하는 이유 고려

먼저, 저는 당신이 정말로 딕트를 색인화할 필요가 있는지 확인하기 위해 말하고 싶습니다.딕트는 원래 순서조차 갖지 않기 위해 고안되었기 때문에, 아마도 기존의 기본 파이썬 데이터 유형의 장점을 사용하여 인덱싱할 필요성을 해결할 수 있는 다른 방법이 있을 것입니다.

예를 들어, 특정 순서에 필요한 색상 목록이 있는 경우 색상 목록을 저장한 다음 색인을 작성하고 딕트에 입력하여 값을 가져옵니다.

color_order = [ 'blue', 'yellow', 'yellow', 'blue' ]
value_0 = colors[color_order[0]]

반면에 색인 0으로 지정된 일부 기본 색상 값이 필요한 경우 별도의 값을 사용하여 기본값을 저장하거나 색인 작업 대신 키로 입력할 수 있는 기본값을 추가하는 것이 좋습니다.

default_color = 'blue'
default_value = colors[default_color]

colors = { 'default': '5', 'blue': '5', 'red': '6', 'yellow': '8' }
default_value = colors['default']

함수를 사용하여 인덱스 찾기

▁into▁counting로 계산하면 찾을 수 .dict.keys()고리 모양으로를 사용하는 경우enumerate()함수는 자동으로 인덱스 값을 생성합니다.

이것이 가장 간단하지만 인덱스를 검색할 때마다 CPU 비용이 조금 더 듭니다.이것은 순서가 지정된 딕트를 가정합니다(Python 3.7+는 이것을 보장합니다).

지정된 인덱스에서 키를 찾는 방법

def key_at_index(mydict, index_to_find):
  for index, key in enumerate(mydict.keys()):
    if index == index_to_find:
      return key
  return None  # the index doesn't exist

키 인덱스 찾기

def index_of_key(mydict, key_to_find):
  for index, key in enumerate(mydict.keys()):
    if key == key_to_find:
      return index
  return None  # the key doesn't exist

키 목록 만들기

많이액세할있솔키경필는키미사를인중목다인경만알으있록로하싱거덱나우는고를스덱음목든을록의복는하러링전을 할 수 있습니다.list.index(item)목록에서 인덱스를 찾는 방법입니다.목록에는 기본적으로 이미 인덱스가 있고 기본 제공 함수가 일반적으로 가장자리 및 모서리 케이스를 올바르게 처리하는 속도와 가능성이 높기 때문에 인덱스로 딕트를 만드는 것보다 목록을 만드는 것이 더 좋습니다.

이 방법을 사용하면 추가 오버헤드가 발생하지만 데이터 분석을 많이 수행하고 정기적으로 인덱스에 액세스해야 하는 경우에는 이러한 이점을 누릴 수 있습니다.

# Note: you don't actually need the `.keys()`, but it's easier to understand
colors_i = list(colors.keys())
index_blue = colors.index('blue')
index0 = colors_i[0]
value0 = colors[index0]

print(f'colors: {colors}\ncolor_i: {colors_i}')
print(f'index_blue = {index_blue}, index0 = "{index0}", value0 = "{value0}"')
# colors: {'blue': '5', 'red': '6', 'yellow': '8'}
# color_i: ['blue', 'red', 'yellow']
# index_blue = 0, index0 = "blue", value0 = "5"

참고: 이것은 정적이며 원본 사전이 업데이트된 경우 업데이트되지 않습니다.목록과 딕트 모두에 새 항목을 추가하여 동기화 상태를 유지해야 합니다.

딕트 및 목록 업데이트 기능

아래는 딕트와 인덱스 목록을 동시에 업데이트하는 기능입니다.항목이 이미 있으면 값이 업데이트되고 목록에 추가되지 않습니다. 그렇지 않으면 목록에 중복 항목이 있는 반면 딕트는 기존 항목만 업데이트합니다.

이 접근 방식은 대량의 처리를 수행하는 경우, 특히 이 위에 다른 확장 기능이 필요한 경우 클래스로 확장될 수 있습니다.

def index_add_item(mydict, index_list, key, value):
  # Note: The dict and list are passed by reference, so we can just update them
  try: # in case key doesn't exist
    existing_value = colors[key]
  except KeyError: # key does not exist, update dict and list
    mydict.update({key: value})
    index_list.append(key)
  else: # key already exists, just update value
    mydict[key] = value

index_add_item(colors, colors_i, 'purple', '99')
print(f'colors: {colors}\ncolors_i: {colors_i}')
# colors: {'blue': '5', 'red': '6', 'yellow': '8', 'purple': '99'}
# colors_i: ['blue', 'red', 'yellow', 'purple']

index_add_item(colors, colors_i, 'blue', '1')
print(f'colors: {colors}\ncolors_i: {colors_i}')
# colors: {'blue': '1', 'red': '6', 'yellow': '8', 'purple': '99'}
# colors_i: ['blue', 'red', 'yellow', 'purple']

그럴 수 없어요, 왜냐하면.dict순서가 없습니다.사용할 수 있습니다..popitem()임의 항목을 가져오지만 딕트에서 제거됩니다.

저는 LightCC 답변으로 한 걸음 더 나아갔습니다.

def key_value(mydict, find_code, find_key, return_value):
  for key in mydict:
    if key[find_code] == find_key:
      return key[return_value]
  return None

그리고 나는 이것이def추가로 최적화할 수 있습니다(거의 한 줄기).

Python 3.7 이상에서 딕트 내 명령이 주어지면, 그 이후.dict삽입 순서에 따라 다음을 수행할 수 있습니다.

  • next(iter(mydict.items()))삽입된 첫 번째 키, 값 쌍을 검색합니다.
  • next(iter(mydict.keys()))첫 번째로 삽입된 키를 검색합니다.
  • next(iter(mydict.value()))첫 번째로 삽입된 값을 검색합니다.

이 방법은 사전의 모든 요소를 반복할 필요가 없습니다.

작동하는 간단한 코드.

# Example dictionary
d = {
    'a': 5,
    'b': 6,
    'c': 7,
    'd': 8,
    'e': 9,
}
# Index you want
index = 3 
# Use the fact that d.keys() is ordered the same as d.values()
value = d[list(d.keys())[index]] 
print(value)

인쇄 예정

8

질문에 따라 키와 값이 동일하게 정렬됩니다.

언급URL : https://stackoverflow.com/questions/4326658/how-to-index-into-a-dictionary

반응형