Init
- mapping - mutablemapping 계통으로
하위 type으로 dict가 유일함. key,value,item으로 구성되며
{key : value}쌍이 기본 구조이고
이 쌍을item이라 함.- 변경가능한 hash table 구조이며
hash가능하지 않은값으로
mutable은 key로 사용할 수 없음. - 괄호는
{ } __init__은
__init__(self, **kwargs)
__init__(self, map, **kwargs)
__init__(self, iterable, **kwargs)
이렇게 있다.
해서dict를 만들수 있는 방법은
기본적으로1 2
a = dict() b = {}
이렇게 빈 dict를 만들 수 있음.
그 외 방법으로는1 2 3 4 5 6
a = dict(one=1, two=2, three=3) b = {'one': 1, 'two': 2, 'three': 3} c = dict(zip(['one', 'two', 'three'], [1, 2, 3])) d = dict([('two', 2), ('one', 1), ('three', 3)]) e = dict({'three': 3, 'one': 1, 'two': 2}) f = dict({'one': 1, 'three': 3}, two=2)
이 때
a == b == c == d == e == f는 True.- dict의 동등비교(==)는
내부 순서가 상관없음 - <, <=, >=, >등의 비교는 TypeError
- insert는 순서상 가장 뒤에 추가되며
3.7이상에서 이 순서를 보장함.
value에 대한 update는
순서에 영향 없음. - reversed는 3.8이상.
Method
| list(dict)[^footnote1] | dict.items()[^footnote] |
| len(dict)[^footnote] | dict.keys()[^footnote] |
| dict[key][^footnote] | dict.pop(key[, default])[^footnote] |
| dict[key]=value[^footnote] | dict.popitem()[^footnote] |
| del dict[key] | reversed(dict)[^footnote] |
| key (not) in dict[^footnote] | dict.setdefauilt(key[, default])[^footnote] |
| iter(dict)[^footnote] | dict.update([other])[^footnote] |
| dict.clear()[^footnote] | dict.values()[^footnote] |
| dict.copy()[^footnote] | dict | other[^footnote] |
| fromkeys(iterable, [, value])[^footnote] | dict |= oather[^footnote] |
| dict.get(key[, default])[^footnote] |
list(dict)
list로 type cast된 새 list반환.- key만 반영됨
1
2
3
data = dict({1: "value1", 2: "value2", 3: "value3"})
test = list(data)
print(test)
1
[1,2,3]
len(dict)
- dict의 item의 수
1
2
data = dict({1: "value1", 2: "value2", 3: "value3"})
print(len(data))
1
3
dict[key]
- key에 해당하는 value를 반환.
- key가 없으면 KeyError
1
2
3
data = dict({1: "value1", 2: "value2", 3: "value3"})
print(data[1])
print(data[4])
1
2
KeyError: 4
value1
- dict를 상속받고
__missing__를 정의하면
KeyError 문제를 해결할 수 있음.
dict[key] = value
- dict[key] 를 value 로 설정
- 이미 key가 있으면 update,
없으면 insert
1
2
3
4
5
data = dict({1: "value1", 2: "value2", 3: "value3"})
data[1] = True
data[4] = "new value"
print(data)
1
{1: True, 2: 'value2', 3: 'value3', 4: 'new value'}
del dict[key]
- key에 해당하는 item삭제
key가 없으면 KeyError
1
2
3
data = dict({1: "value1", 2: "value2", 3: "value3"})
del data[1]
print(data)
1
{2: 'value2', 3: 'value3'}
key (not) in dict
- dict에 key가 있으면 True(False)
없으면 False(True).
iter(dict)
- key에 대한 iterator 반환,
- same as
iter(d.keys())
dict.clear()
- dict의 모든 item삭제
dict.copy()
- dict의 얕은복사
fromkeys(iterable, [, value])
- iterable을 key로 하고
value를 갖는 새 dict를 반환.
1
2
3
4
5
6
7
8
k = [1, 2, 3]
v = ['v1', 'v2', 'v3']
ndata = dict.fromkeys(k,v)
print(ndata)
ndata[3] = 3
print(ndata)
1
2
{1: ['v1', 'v2', 'v3'], 2: ['v1', 'v2', 'v3'], 3: ['v1', 'v2', 'v3']}
{1: ['v1', 'v2', 'v3'], 2: ['v1', 'v2', 'v3'], 3: 3}
- value를 지정하지 않을수있음
그럴경우 None - parameter로 전달한 value는
단일 instance로 취급하고
새 dict의 모든 value가 됨.
위의 결과가
{1: 'v1', 2: 'v2', 3: 'v3']}이
아닌것처럼. 또한 parameter로 전달한value를
dict 생성 이후에 수정하면
해당 value참조가 전부 바뀜1 2 3 4 5 6
k = [1, 2, 3] v = ['v1', 'v2', 'v3'] ndata = dict.fromkeys(k,v) print(ndata) v[2] = 123 print(ndata)
1 2
{1: ['v1', 'v2', 'v3'], 2: ['v1', 'v2', 'v3'], 3: ['v1', 'v2', 'v3']} {1: ['v1', 'v2', 123], 2: ['v1', 'v2', 123], 3: ['v1', 'v2', 123]}
이런 비슷한 문제는
type inheritance에 쓴적있음.
dict.get(key [, default])
- key에 해당하는 value반환.
1
2
3
4
data = dict({1: "value1", 2: "value2", 3: "value3"})
print(data.get(3))
print(data.get(4, "empty value"))
1
2
value3
empty value
- key가 없을 경우 None를 반환
이 경우에 대한 반환값은 변경 가능. dict[key]와 다르게 KeyError가 없음.
dict.items()
- dict의 item view를 반환.
1
2
3
data = dict({1: "value1", 2: "value2", 3: "value3"})
print(data.items())
1
dict_items([(1, 'value1'), (2, 'value2'), (3, 'value3')])
- for에서 자주씀.
for item in dict:가 안되서
for k, v in data.items():
dict.keys()
- dict의 key view를 반환.
dict.pop(key [, default])
- key에 해당하는 value반환.
1
print(data.pop(4, None))
1
None
- key가 없으면 KeyError인데
default를 지정하면
KeyError없이 지정된 default를 반환
dict.popitem()
- 위 기능을 LIFO로 실행함.
LIFO순서 보장은 3.7이상 - dict가 비어있으면 KeyError
reversed(dict)
- key에 대해 reversed iterator 반환.
- same as
reversed(d.keys()) - iter의 반대
dict.setdefault(key [, default])
- key가 있으면 해당 value반환
- 없으면 key insert하고
해당 value를 default로 설정후
default를 반환. - default를 지정하지 않을수 있고
그럴경우 None.
1
2
3
4
5
data = dict({1: "value1", 2: "value2", 3: "value3"})
print(data.setdefault(3, 3))
print(data.setdefault(4, "val 4"))
print(data)
1
2
3
value3
val 4
{1: 'value1', 2: 'value2', 3: 'value3', 4: 'val 4'}
dict.update([other])
- other의 key/value쌍으로 update.
- 기존 key를 덮어쓰며 None를 반환.
- other에 들어갈 형식은
dict생성방법과 동일해야함. - key가 있으면 update,
key가 없으면 insert
1
2
3
data = dict({1: "value1", 2: "value2", 3: "value3"})
data.update({1:"updated", 4:"new 4"})
print(data)
1
{1: 'updated', 2: 'value2', 3: 'value3', 4: 'new 4'}
dict.values()
- dict의 value view반환.
view끼리 eq비교는 항상 False
1
print(data.values() == data.values())
1
False
dict | other
- dict와 other을 합친 새 dict반환.
- dict, other은 dict type이어야함.
- 둘 다 같은키를 갖는다면
other의 value를 사용.
1
2
3
4
data = dict({1: "value1", 2: "value2", 3: "value3"})
other = dict({3:3, "value 4": 4, "value 5": 5})
print(data | other)
1
2
3
4
data = dict({1: "value1", 2: "value2", 3: "value3"})
other = dict({3:3, "value 4": 4, "value 5": 5})
print(data | other)
dict |= other
- other을 이용해
dict를 update함
위는 새 dict반환이면
이건 dict update. - other은 key/value쌍의
mapping 또는 iterable일 수 있음.
Dictionary view objects
- 위에 한번씩 나왔지만
dict.keys(),dict.values(),
dict.items()는
각각의 view object를 반환함. - 이 new object들은 동적으로
dict의 변경이 항상 반영됨. - 지원하는 method로는
len,iter,in,reversed,
dictview.mapping이 있음.
dict의 method에서
이름이 같으면 같은기능. dictview.mapping의 경우
view의 원본 dict를 감싸는
types.MappingProxyType을 반환.
3.10이상 지원.- key view는 항목이 고유하고
hash가능하기 때문에 set과 유사. - 모든 value가 hash 가능하여
(key, value) 쌍이 고유하다면
item view도 set과 유사. - value view는 일반적으로
항목이 고유하지 않으므로
set과 유사하게 취급되지 않음. - 집합형 뷰의 경우
collections.abc.Set에 대해 정의된
모든 연산을 사용 가능.
예를들어==,<,^ view 사용 예
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500} keys = dishes.keys() values = dishes.values() # iteration n = 0 for val in values: n += val print(n) # keys and values are iterated over in the same order (insertion order) print(list(keys)) print(list(values)) # view objects are dynamic and reflect dict changes del dishes['eggs'] del dishes['sausage'] print(list(keys)) # set operations print(keys & {'eggs', 'bacon', 'salad'}) print(keys ^ {'sausage', 'juice'}) # # get back a read-only proxy for the original dictionary # values.mapping # # values.mapping['spam']
1 2 3 4 5 6
504 ['eggs', 'sausage', 'bacon', 'spam'] [2, 1, 1, 500] ['bacon', 'spam'] {'bacon'} {'spam', 'bacon', 'sausage', 'juice'}
Comments powered by Disqus.