딕셔너리는 변하지 않는 타입의 keys로 색인됩니다. (글자나 숫자는 항상 keys가 될 수 있습니다.) 튜플들도 문자열이나 숫자, 튜플로만 구성되어 있다면 keys로 이용될 수 있습니다. 튜플이 직접적으로, 간접적으로 변할 수 있는 개채를 포함하고 있다면, keys로 사용할 수 없습니다. 리스트는 색인이나 쪼개기, append()나 extend()와 같은 Method를 통해 위치가 변할 수 있으므로 keys로 이용될 수 없습니다.
딕셔너리는 순서가 없는 '키:값'(유일한 값들의 모임)입니다. 중괄호 두개는 빈 딕셔너리를 만듭니다. 중괄호 안에 컴마로 구분된 '키:값'의 리스트는 처음 키:값을 딕셔너리에 더합니다. 이것은 딕셔너리가 산출물에 쓰여지는 방식이기도 합니다.
딕셔너리의 중요 기능은 어떤 키에 값을 저장하고 값이 주어진 키에서 값을 추출하는 것입니다. 또 del을 이용해 '키:값'을 삭제할 수도 있습니다. 만약 이미 사용된 키를 이용해 저장한다면, 그 키와 관련된 이전 값은 지워집니다. 존재하지 않는 키에서 값을 추출하려 하면 에러가 납니다.
list(d.keys())로 만들어진 딕셔너리는 임의의 순서로 모든 키의 리스트를 딕셔너리 안에서 반환합니다. 정렬을 위해선 sorted(d.keys())를 이용합니다. 딕셔너리에 해당 키가 있는지를 확인하려면 in을 이용합니다.
a = {'a':1000, 'c':3000, 'b':2000}
a['d'] = 4000 #'d':4000을 추가합니다.
print(a)
print(a['a'])
del a['a'] #'a':1000을 삭제합니다.
print(list(a.keys())) #a의 키 목록을 추출합니다.
print(sorted(a.keys())) #a의 키 목록을 정렬하여 추출합니다.
{'a': 1000, 'c': 3000, 'b': 2000, 'd': 4000}
1000
['c', 'b', 'd']
['b', 'c', 'd']
dict()함수는 키-값의 연속행력을 직접적으로 딕셔너리로 만들어줍니다. 추가적으로 복합 딕셔너리도 임의의 키와 값 표현식으로 만들 수 있습니다.
>>> dict([('a', 1000), ('b', 2000), ('c', 3000)])
{'a': 1000, 'b': 2000, 'c': 3000}
>>> {i : i**2 for i in range(1,5)}
{1: 1, 2: 4, 3: 9, 4: 16}
키가 간단한 문자열이면 아래와 같이 키워드 인수를 이용해 표현하는 것이 편리합니다.
>>> dict(a=1000, b=2000, c=3000)
{'a': 1000, 'b': 2000, 'c': 3000}
딕셔너리를 통해서 루프를 쓸 때, items() 매소드를 이용해서 키와 일치하는 값을 동시에 검색할 수 있습니다.
a = {'a':1000, 'b':2000, 'c':3000}
for i, n in a.items():
print(i,n)
a 1000
b 2000
c 3000
시퀀스를 통해 루프를 쓸 때, enumerate()를 이용해 위치 색인과 일치하는 값을 동시에 검색할 수 있습니다.
a = ['a','b','c','d']
for i, n in enumerate(a):
print(i,n)
0 a
1 b
2 c
3 d
두개 이상의 시퀀스에서 루프를 쓸 때, zip()을 이용해 개채들을 쌍으로 검색할 수 있습니다.
a = ['a','b','c','d']
b = [100,200,300,400]
for i, n in zip(a,b):
print("{0}={1}".format(i,n))
a=100
b=200
c=300
d=400
시퀀스를 거꾸로 반복하려면 먼저 순방향으로 시퀀스를 정한 다음 reversed() 함수를 써줍니다.
시퀀스를 정렬된 순서로 반복하려면, 원래의 정렬순서를 벗어나 새롭게 정렬해주는 sorted() 함수를 씁니다.
for i in reversed(range(1,4)):
print(i)
a = ['하나', '둘', '셋', '하나', '넷']
for n in sorted(set(a)):
print(n)
3
2
1
넷
둘
셋
하나
만약에 루프문을 돌릴 때 리스트가 변경될 수도 있습니다. 그러나 이것은 새로운 리스트를 만드는 것보다 쉽고 안전합니다.
import math
r = [1.11, float('NaN'), 2.22, 3.33, float('NaN'), 4.44]
r2 = []
for value in r :
if not math.isnan(value):
r2.append(value)
print(r2)
[1.11, 2.22, 3.33, 4.44]
math.isnan()은 float이 NaN이 아님을 확인해주는 함수입니다.
while이나 if를 이용한 조건에는 단순 비교가 아닌 다양한 연산자가 포함될 수 있습니다. in과 not in 비교 연산자는 시퀀스에서 값이 발생할 수 있을지 없을지를 확인합니다. is와 is not 연산자는 두개의 개체가 같은지 아닌지를 확인합니다. 이것은 리스트 같이 변경가능한 객체에만 해당됩니다. 모든 비교 연산자의 우선순위는 같으면 숫자 연산자보다 낮습니다.
비교 연산자는 연결될 수 있습니다. a < b == c는 a가 b보다 작고 나아가 b가 c와 같다는 것을 검증합니다.
비교는 and와 or, 또는 not을 쓰는 부정비교 연산자 등의 불리언 연산자와 함께 쓰입니다. 이것은 비교 연산자보다 낮은 순위를 가집니다. 그를 사이에서는 not이 가장 높은 순위를, or이 가장 낮은 순위를 가집니다. 그래서 A and not B or C는 (A and (not B)) or C와 같습니다. 언제나 그렇듯, 괄호를 이용하여 원하는 순위를 표현할 수 있습니다.
불리언 연산자 and와 or는 짧은 단락 연산자로도 불립니다. 인수들을 왼쪽에서 오른쪽으로 판단하고, 판단은 결과가 결정되자 마자 멈춰집니다. 예를 들어 A와 C가 진실이지만 B는 거짓일 때, A and B and C는 C식을 판단하지 않습니다. 일반적인 값을 이용하고 불리언을 이용하지 않을 때, 짧은 단락 연산자의 반환값은 가장 마지막으로 계산된 인수입니다.
비교나 다른 불리언 표현석의 결과를 변수로 배정하는 것이 가능합니다.
a1,a2,a3='','name','firstName'
na = a1 or a2 or a3
print(na)
name
시퀀스 객체는 같은 시퀀스 타입을 가진 다른 객체와 비교할 수 있습니다. 비교는 사전식의 순서를 이용합니다. 먼저 처음 두 항목을 비교하고 차이가 있는 경우, 비교의 결과값을 결정합니다. 같으면 다음 두 항목을 비교하는 것을 시퀀스가 끝날 때까지 반복합니다. 비교되는 2 개의 항목 자체가 같은 형태의 순서인 경우, 사전 편집 비교가 재귀적으로 실행됩니다. 두 시퀀스의 모든 아이템들이 같다고 판단되면, 시퀀스는 같은 것으로 간주됩니다. 하나의 시퀀스가 다른 시퀀스의 부분이면, 짧은 시퀀스가 작은 시퀀스가 됩니다. 문자열의 사전적 순서는 유니코드를 이용합니다.
(1, 2, 3) < (1, 2, 4) [1, 2, 3] < [1, 2, 4] 'ABC' < 'C' < 'Pascal' < 'Python' (1, 2, 3, 4) < (1, 2, 4) (1, 2) < (1, 2, -1) (1, 2, 3) == (1.0, 2.0, 3.0) (1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4)
< 또는 >로 다른 유형의 객체를 비교하는 것은 해당 객체가 적절한 비교 방법을 가지고 있으면 합법적입니다. 예를 들어, 혼합 숫자 타입은 그들의 숫자값에 따라 비교됩니다. 0은 0.0과 같습니다. 아니면 인터프리터는 임의의 순서를 제공하는 것보다 TypeError 오류를 나타냅니다.
-------------------------
안녕하세요! 호두입니다.
이번 글에선 딕셔너리 데이터 타입과 시퀀스에서 루프와 비교를 이용하는 법을 다루었습니다.
공식 메뉴얼이 13장까지 있던데 이제 겨우 5장을 끝냈네요. 갈길이 너무 멀군요.ㅠㅠ