[파이썬] Mapping Types - dictionary view objects

Dictionary view objects

dict.keys(), dict.values(), dict.items() 가 리턴하는 객체는 view object 입니다. 딕셔너리의 항목들에 대한 동적 뷰를 제공합니다. 즉, 딕셔너리가 변경되면 뷰는 이러한 변경 사항을 반영합니다.

dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}

keys = dishes.keys() # -> dict_keys(['eggs', 'sausage', 'bacon', 'spam'])
values = dishes.values() # -> dict_values([2, 1, 1, 500])
items = dishes.items() # -> dict_items([('eggs', 2), ('sausage', 1), ('bacon', 1), ('spam', 500)])

del dishes['eggs']
del dishes['sausage']
list(keys) # -> ['bacon', 'spam']

딕셔너리 뷰는 이터레이션을 통해 각각의 데이터를 산출할 수 있고, 멤버십 검사를 지원합니다:

operations

len(dictview)

딕셔너리에 있는 항목 수를 반환

dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}

items = dishes.items()
len(items) # -> 4

iter(dictview)

딕셔너리에서 key, value, item(key, value)에 대한 이터레이터를 돌려줍니다.

키와 값은 삽입 순서로 이터레이션 됩니다. 이 때문에 zip()을 사용해서 (value, key) 쌍을 만들 수 있습니다: pairs = zip(d.values(), d.keys()) 같은 리스트를 만드는 다른 방법은 pairs = [(v, k) for (k, v) in d.items()] 입니다.

딕셔너리에 항목을 추가하거나 삭제하는 동안 뷰를 이터레이션 하면 RuntimeError 를 일으키거나 모든 항목을 이터레이션 하지 못할 수 있습니다.

버전 3.7에서 변경: 딕셔너리의 순서가 삽입 순서임이 보장됩니다.

dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}

values = dishes.values() # -> dict_values([2, 1, 1, 500])
n = 0
for val in values:
  n += val

print(n) # -> 504

# keys and values are iterated over in the same order (insertion order)
list(keys) # -> ['eggs', 'sausage', 'bacon', 'spam']
list(values) # -> [2, 1, 1, 500]

x in dictview

x 가 하부 딕셔너리의 key, value, item에 있는 경우 True 를 돌려줍니다 (마지막의 경우 x 는 (key, value) 튜플이어야 합니다).

dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}

keys = dishes.keys() # -> dict_keys(['eggs', 'sausage', 'bacon', 'spam'])
values = dishes.values() # -> dict_values([2, 1, 1, 500])
items = dishes.items() # -> dict_items([('eggs', 2), ('sausage', 1), ('bacon', 1), ('spam', 500)])

'eggs' in keys # -> True
2 in values # -> True
('eggs', 2) in items # -> True

reversed(dictview)

딕셔너리의 키, 값 또는 항목에 대한 역방향 이터레이터를 반환합니다. 뷰는 삽입의 역순으로 이터레이트됩니다.

버전 3.8에서 변경: 딕셔너리 뷰는 이제 역 탐색할 수 있습니다.

reversed(keys) # -> <dict_reversekeyiterator object at 0x101dda520>

dictview.mapping

뷰를 참조하는 기존의 딕셔너리를 wrap 하는 types.MappingProxyType을 반환합니다.

버전 3.10에 추가.

key 뷰는 항목이 고유하고 해시 가능하므로 집합과 유사합니다. 모든 값이 해시 가능해서 (key, value) 쌍들이 고유하고 해시 가능하다면, 항목 뷰 역시 집합과 유사합니다. (value 뷰는 항목이 일반적으로 고유하지 않기 때문에 집합과 같이 취급되지 않습니다.) 집합과 유사한 뷰의 경우 추상 베이스 클래스 collections.abc.Set 에 정의된 모든 연산을 사용할 수 있습니다 (예를 들어, ==, <, ^).

# set operations
keys & {'eggs', 'bacon', 'salad'} # -> {'eggs', 'bacon'}
keys ^ {'sausage', 'juice'} # -> {'eggs', 'juice', 'bacon', 'spam'}

# get back a read-only proxy for the original dictionary
values.mapping # -> {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
values.mapping['spam'] # -> 500

links

social