Skip to content
난이도 출제 빈출문제은행 4

Python 기본: 리스트·range·슬라이스 2 ​

앞 문서의 리스트(list)에 이어, 딕셔너리(dictionary)·집합(set)·문자열 메서드(method)와 리스트 컴프리헨션(list comprehension), 나눗셈 연산자, print의 출력 형식, 리스트 복사를 다룬다. 모두 Python 3 기준이다.

딕셔너리·집합·문자열 메서드 ​

딕셔너리의 get(k, 기본값)은 키가 없을 때 오류 대신 기본값을 돌려준다. keys()·values()·items()는 키, 값, (키, 값) 쌍을 꺼내고, update()는 다른 딕셔너리의 내용을 합친다. 집합은 add()로 하나, update()로 여러 개를 넣고, 이미 있는 값은 무시한다. 빼는 것은 remove()다. union()이나 |는 합집합을 새로 만든다.

문자열 메서드는 원본을 바꾸지 않고 새 문자열을 돌려준다. 문자열은 튜플(tuple)처럼 바꿀 수 없는 자료형이기 때문이다. 자주 나오는 것은 upper()·lower(), 구분자로 쪼개는 split(), 반대로 이어 붙이는 "-".join(리스트), 위치를 찾는 find(), 개수를 세는 count(), 바꾸는 replace()다.

리스트 컴프리헨션과 나눗셈 ​

리스트 컴프리헨션은 [식 for 변수 in 모음 if 조건] 한 줄로(여기서 모음은 값을 순서대로 꺼낼 수 있는 리스트·range 같은 것이다) 새 리스트를 만드는 문법이다. 반복문과 append를 세 줄로 쓸 것을 한 줄로 줄여 주므로 출력 문제에 자주 나온다. [x * x for x in range(5) if x % 2 == 0]은 0, 2, 4만 골라 제곱한 [0, 4, 16]이다.

Python 3에서 /는 항상 실수 나눗셈이라 7 / 2는 3.5다. 몫만 원하면 //를 쓰며, 음수는 더 작은 쪽으로 내려서 -7 // 2는 -4다. C·Java처럼 3이나 -3으로 답하면 틀린다. 나누어떨어져도 /의 결과는 실수라서 12 / 3은 4가 아니라 4.0으로 찍히고, y /= 3도 y를 실수로 바꾼다.

print는 값 여러 개를 받으면 사이에 공백을 넣고 끝에 줄바꿈을 붙인다. sep=은 값 사이에 넣을 문자열을, end=는 끝에 붙일 문자열을 바꾼다. 반복문 안의 print(i, end=" ")가 한 줄에 이어 찍히는 이유가 이것이다. "%s:%d" % ("n", 7)처럼 % 서식은 문자열 속 %s(문자열)·%d(정수) 자리에 값을 차례로 넣는다.

x, y = "ab-cd".split("-")처럼 왼쪽에 이름을 여러 개 쓰면, 오른쪽 모음의 요소가 순서대로 하나씩 들어간다. 개수가 다르면 오류가 난다.

복사와 별칭 ​

b = a는 리스트를 복사하지 않고 같은 리스트에 이름을 하나 더 붙인다. 그래서 b.append()를 하면 a도 바뀐다. 따로 쓰려면 a[:]나 a.copy()로 복사한다. 이 복사는 얕은 복사(shallow copy)라서 바깥 리스트만 새로 만들고, 안에 든 리스트는 원본과 함께 쓴다. 안쪽까지 따로 두려면 copy.deepcopy()를 쓴다.

python
a = [[1, 2], [3]]
b = a; c = a[:]
c[0].append(9); c[1] = [0]
print(a, b is a, c)   # [[1, 2, 9], [3]] True [[1, 2, 9], [0]]

시험 포인트 ​

  • 7 / 2 → 3.5, 7 // 2 → 3, -7 // 2 → -4.
  • 집합은 중복 제거·순서 없음, 빈 {}는 딕셔너리.
  • 문자열 메서드는 원본을 바꾸지 않고 새 문자열을 돌려준다. dict.get(k, 기본값)은 키가 없으면 기본값.
  • print(1, 2, sep="-", end="!") → 1-2!. 12 / 3 → 4.0.
  • b = a는 같은 리스트, a[:]는 얕은 복사라 안쪽 리스트는 공유.

관련 문서