색인으로 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. 사전의 키 순서는 사전의 내용과 키가 추가 된 순서에 따라 변경 될 수 있습니다.


당신은 사용하지 않는 OrderedDictcollections라이브러리
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")반환 하고 하위 트리 10dig(mydict, "Grape")생성합니다 {'Arabian':'25','Indian':'20'}. 키가 사전에 포함되지 않은 경우를 dig반환합니다 None.

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

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