색인으로 Python 사전 요소에 액세스


118

다음과 같은 사전을 고려하십시오.

mydict = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} }

예를 들어이 사전의 특정 요소에 어떻게 액세스합니까? 예를 들어 Apple의 첫 번째 요소를 포맷 한 후 첫 번째 요소를 인쇄하고 싶습니다.

추가 정보 위의 데이터 구조는 파이썬 함수에서 입력 파일을 구문 분석하여 생성되었습니다. 그러나 일단 생성되면 해당 실행에 대해 동일하게 유지됩니다.

내 기능에서이 데이터 구조를 사용하고 있습니다.

따라서 파일이 변경되면 다음에이 응용 프로그램을 실행할 때 파일의 내용이 다르므로이 데이터 구조의 내용은 다르지만 형식은 동일합니다. 그래서 당신은 내 기능에서 내가 애플의 첫 번째 요소가 'American'인지 다른 것을 알지 못하기 때문에 'American'을 키로 직접 사용할 수 없습니다.


2
예상 한 결과의 예를 들어 주시겠습니까?
— Björn Pollex 2011 년

3
이 구조로 실제로 무엇을 하시겠습니까? 그리고 dict의 키를 알고 있습니까 (예 : 'Apple'및 'Grapes')? 아니면 딕셔너리를받을 것이라는 것만 알고 있습니까?
— juanchopanza 2011 년

6
사전을 부르지 마십시오 dict. 'dict'라는 단어는 이미 Python의 키워드입니다. 같은 다른 것을 사용하십시오 mydict.
— 릭 모니카 지원

참고 :이 질문은 index로 dict 요소에 액세스하는 것에 관한 것입니다. 이는 dict 가 순서가 지정되지 않았기 때문에 의미가 없습니다. 중첩 된 dict의 요소에 액세스하는 방법에 대한 질문은 Python- 사전 내에 중첩 된 값에 액세스를 참조하십시오 .
— Aran-Fey

@ Aran-Fey : 정렬되지 않은 것은 본질적인 순서를 가지고 있습니다. 주문되지 않음! = 주문이 없습니다.
— Jamie Marshall

답변:


122

사전이므로 키를 사용하여 액세스합니다. "Apple"에 저장된 사전을 가져 오려면 다음을 수행하십시오.

>>> mydict["Apple"]
{'American': '16', 'Mexican': 10, 'Chinese': 5}

그리고 그들 중 얼마나 많은 미국인이 (16)인지 다음과 같이하십시오.

>>> mydict["Apple"]["American"]
'16'

9
요소의 깊이를 모르고 어떻게 동적으로이를 수행 할 수 있습니까?
— Ethan Bierlein

3
정확히 무엇을 알고 싶으십니까? .keys()동적으로 액세스 할 수 있도록 사전의 키를 가져올 수 있습니다 .
— Morten Kristensen 2015 년

3
예를 들어, 중첩 된 사전과 같이 깊이를 알 수없는 사전이 "n"있고 알 수없는 요소에 저장된 알 수없는 깊이의 요소가있는 경우입니다.
— Ethan Bierlein

1
매우 광범위한 질문입니다. 데이터 구조가 주어지면 적절하게 처리 할 함수 또는 클래스를 작성합니다. 아마도 키를 찾으려고 시도하기위한 키와 전략을 제공 할 수 있습니다.
— Morten Kristensen

1
@EthanBierlein 사용 : 'for key, value in dictionary.iteritems ()'to have access to both key and value
— danius

25

질문이 있다면 과일로 'Apple'을 포함하고 사과 유형으로 'American'을 포함하는 사전이 있다는 것을 알고 있다면 다음을 사용합니다.

myDict = {'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
          'Grapes':{'Arabian':'25','Indian':'20'} }


print myDict['Apple']['American']

다른 사람들이 제안했듯이. 대신 질문이 있다면, dict 데이터 구조의 dict에 임의의 파일을 읽을 때 'Apple'이 과일이고 'Apple'유형 인 'American'이 존재하는지 여부를 알 수없는 경우 다음과 같이 할 수 있습니다.

print [ftype['American'] for f,ftype in myDict.iteritems() if f == 'Apple' and 'American' in ftype]

또는 더 좋은 방법으로 Apple에만 American 유형이 있다는 것을 알고 있다면 dict의 전체 사전을 불필요하게 반복하지 않아도됩니다.

if 'Apple' in myDict:
    if 'American' in myDict['Apple']:
        print myDict['Apple']['American']

이 모든 경우에 사전이 실제로 항목을 저장하는 순서는 중요하지 않습니다. 주문에 대해 정말로 염려하는 경우OrderedDict .

http://docs.python.org/dev/library/collections.html#collections.OrderedDict


20

설명을 보았을 때 파서가 값이 다음과 같은 사전이라는 사전을 제공한다는 것을 알고 있습니다.

sampleDict = {
              "key1": {"key10": "value10", "key11": "value11"},
              "key2": {"key20": "value20", "key21": "value21"}
              }

따라서 부모 사전을 반복해야합니다. sampleDict.values()목록의 모든 첫 번째 사전 키를 인쇄하거나 액세스 하려면 다음과 같이 사용할 수 있습니다.

for key, value in sampleDict.items():
    print value.keys()[0]

에서 첫 번째 항목의 첫 번째 키에 액세스하려는 경우 sampleDict.values()유용 할 수 있습니다.

print sampleDict.values()[0].keys()[0]

질문에서 제시 한 예를 사용하면 다음을 의미합니다.

sampleDict = {
              'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
              'Grapes':{'Arabian':'25','Indian':'20'}
              }

첫 번째 코드의 출력은 다음과 같습니다.

American
Indian

두 번째 코드의 출력은 다음과 같습니다.

American

10

보너스로 귀하의 문제에 대한 다른 해결책을 제공하고 싶습니다. 특히 내부 키의 존재를 확인해야 할 때 일반적으로 지루한 중첩 사전을 다루는 것 같습니다.

pypi에 이와 관련된 흥미로운 라이브러리가 있습니다. 여기에 빠른 검색 이 있습니다.

특정 경우에는 dict_digger가 적합합니다.

>>> import dict_digger
>>> d = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} 
}

>>> print(dict_digger.dig(d, 'Apple','American'))
16
>>> print(dict_digger.dig(d, 'Grapes','American'))
None

8

을 사용 dict['Apple'].keys()[0]하여 Apple사전 의 첫 번째 키를 가져올 수 있지만 American. 사전의 키 순서는 사전의 내용과 키가 추가 된 순서에 따라 변경 될 수 있습니다.


당신은 사용하지 않는 OrderedDict에 collections라이브러리
— Escachator

7

나는 이것이 8 살이라는 것을 알고 있지만 아무도 실제로 질문을 읽고 대답하지 않은 것 같습니다.

dict에서 .values ​​()를 호출하여 내부 딕셔너리 목록을 가져와 인덱스로 액세스 할 수 있습니다.

>>> mydict = {
...  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
...  'Grapes':{'Arabian':'25','Indian':'20'} }

>>>mylist = list(mydict.values())
>>>mylist[0]
{'American':'16', 'Mexican':10, 'Chinese':5},
>>>mylist[1]
{'Arabian':'25','Indian':'20'}

>>>myInnerList1 = list(mylist[0].values())
>>>myInnerList1
['16', 10, 5]
>>>myInnerList2 = list(mylist[1].values())
>>>myInnerList2
['25', '20']

2
흥미로운, 나는 이것을 시도하고 'dict_values' object does not support indexing . 당신이 목록을 복구 할 dict_values을 포장 할 필요가 있기 때문에이 대답 업데이트를 필요로 추측
— Yuca

1
@Yucca-당신이 맞았어요, 나는 내 코드를 테스트하지 않았습니다. 답변이 업데이트되었습니다
— Jamie Marshall



1

이 질문에 대한 많은 답변에도 불구하고 사전이 순서가 지정되지 않은 매핑이라는 점을 지적한 사람은 거의 없으며 따라서 (Python 3.7의 삽입 순서가 축복 될 때까지) 문자 그대로 만들어진 사전의 "첫 번째"항목에 대한 아이디어가 말이되지 않는다. 그리고 심지어는 OrderedDict단지 등 uglinesses 이용한 수치 색인에 의해 액세스 될 수있다 mydict[mydict.keys()[0]](파이썬 2 만 파이썬 3 이후 keys()비 첨자에 반복기이다.)

3.7 이후부터 실제로 3,6에서도 새로운 동작이 도입되었지만 3.7까지 언어 사양의 일부로 포함되지 않았습니다. dict의 키, 값 또는 항목에 대한 반복 (그리고 저는 set also)는 가장 최근에 삽입 된 개체를 먼저 생성합니다. 삽입의 숫자 색인으로 액세스하는 간단한 방법은 아직 없습니다.

항목을 선택하고 "형식화"하는 질문에 대해 사전에서 검색하려는 키를 알고있는 경우 일반적으로 키를 검색하기 위해 아래 첨자로 사용합니다 (my_var = mydict['Apple'] ).

항목 번호로 항목을 인덱싱 할 수 있기를 원하면 (삽입이 수행됨에 따라 특정 항목의 번호가 변경된다는 사실을 무시하고) 적절한 구조는 아마도 2 요소 튜플의 목록 일 것입니다. 대신에

mydict = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} }

다음을 사용할 수 있습니다.

mylist = [
    ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}),
    ('Grapes', {'Arabian': '25', 'Indian': '20'}
]

이 체제에서 첫 번째 항목은 mylist[0]고전적인 목록 끝 형식이며 그 값은 ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5})입니다. 다음과 같이 전체 목록을 반복 할 수 있습니다.

for (key, value) in mylist:  # unpacks to avoid tuple indexing
    if key == 'Apple':
        if 'American' in value:
            print(value['American'])

그러나 "Apple"키를 찾고 있다는 것을 알고 있다면 대신 dict를 사용하지 않는 이유는 무엇입니까?

키 목록을 캐시하여 추가적인 수준의 간접 지정을 도입 할 수 있지만 두 데이터 구조를 동기화 상태로 유지하는 복잡성은 필연적으로 코드의 복잡성을 추가합니다.


0

다음과 같은 작은 기능을 사용하면 나무 모양의 사전을 쉽게 파헤칠 수 있습니다.

def dig(tree, path):
    for key in path.split("."):
        if isinstance(tree, dict) and tree.get(key):
            tree = tree[key]
        else:
            return None
    return tree

이제을 dig(mydict, "Apple.Mexican")반환 하고 하위 트리 10를 dig(mydict, "Grape")생성합니다 {'Arabian':'25','Indian':'20'}. 키가 사전에 포함되지 않은 경우를 dig반환합니다 None.

구분 문자를 '.'에서 쉽게 변경 (또는 매개 변수화) 할 수 있습니다. '/', '|' 기타

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.