기본 미션 : 리스트, 딕셔너리, 범위 자료형에 대해 이해한 내용을 바탕으로 포스팅하기
선택 미션 : p. 213쪽의 1번 문제의 답 쓰고 인증하기
리스트
란?
여섯 개의 자료가 담긴 리스트를 선언한 다음과 같은 예를 통해 리스트의 감을 잡고 가보자.
>>> array = [273, 32, 103, "문자열", True, False]
>>> print(array)
[273, 32, 103, '문자열', True, False]
: 대괄호 []
에 자료를 쉼표
로 구분해서 입력
[요소, 요소, 요소,..] # [] 안에 넣는 자료를 요소 (element)라고 한다.
예시
>>> [1,2,3,4] # 숫자만으로 구성된 리스트
[1,2,3,4]
>>> ["안","녕","하","세","요"] # 문자열만으로 구성된 리스트
["안","녕","하","세","요"]
>>> [273, 24, 103,"문자열",True,False] # 여러 자료형으로 구성된 리스트
[273, 24, 103,"문자열",True,False]
: 리스트 안의 요소를 각각 사용하려면 리스트 이름 바로 뒤에 대괄호 []
를 입력한 뒤, 자료의 위치를 나타내는 숫자를 입력
다음과 같이 리스트를 선언하면
list_a = [273, 24, 103,"문자열",True,False]
각각의 요소는 다음과 같이 저장된다.
273 | 32 | 103 | 문자열 | True | False |
---|---|---|---|---|---|
[0] | [1] | [2] | [3] | [4] | [5] |
인덱스 []
: 리스트 기호인 []
안에 들어간 숫자리스트 요소는 변경할 수 있다. 다음과 같이 입력해보자.
>>> list_a = [273, 24, 103,"문자열",True,False]
>>> list_a[0] = "변경"
>>> list_a
['변경', 24, 103,'문자열',True,False]
'변경' | 32 | 103 | 문자열 | True | False |
---|---|---|---|---|---|
[0] | [1] | [2] | [3] | [4] | [5] |
>>> list_a = [273, 24, 103,"문자열",True,False]
>>> list_a[-1]
False
>>> list_a[-2]
True
>>> list_a[-3]
'문자열'
'변경' | 32 | 103 | 문자열 | True | False |
---|---|---|---|---|---|
[-6] | [-5] | [-4] | [-3] | [-2] | [-1] |
>>> list_a = [273, 24, 103,"문자열",True,False]
>>> list_a[3]
'문자열'
>>> list_a[3][0]
'문'
list_a
의 3
번째 방에 있는 문자열인 '문자열'
에서 0
번째에 있는 '문'
을 출력한다.>>> list_a = [[1,2,3],[4,5,6],[7,8,9]]
>>> list_a[1] # list_a의 1번째 방의 리스트
[4,5,6]
>>> list_a[1][1] # list_a의 1번째 방의 1번째 숫자
5
list_a
는 3
개의 리스트를 가지는 리스트가 된다.
IndexError
예외: 리스트의 길이를 넘는 인덱스로 요송에 접근하려고 할 때 발생하는 예외
>>> list_a = [273,32,103]
>>> list_a[3]
이 코드를 실행하면 list_a
에는 [3]
번째 요소가 없으므로 IndexError
예외가 발생한다.
(+)
, 반복(*)
, len()
+
: 문자열 연결 연산자*
: 문자열 반복 연산자len()
: 해당 리스트의 요소의 개수를 세어준다.소스코드 list01.py
# 리스트를 선언합니다.
list_a = [1,2,3]
list_b = [4,5,6]
# 출력
print("# 리스트")
print("list_a =", list_a)
print("list_b =", list_b)
print()
# 기본 연산자
print("# 리스트 기본 연산자")
print("list_a + list_b =", list_a+list_b)
print("list_a * 3 =", list_a*3)
print()
# 함수
print("# 길이 구하기")
print("len(list_a) =", len(list_a))
append()
, insert()
append()
: 리스트 뒤
에 요소를 추가리스트명.append(요소)
insert()
: 리스트의 중간
에 요소를 추가리스트명.insert(위치, 요소)
소스코드 list02.py
# 리스트 선언
list_a = [1,2,3]
# 리스트 뒤에 요소 추가하기
print("# 리스트 뒤에 요소 추가하기")
list_a.append(4)
list_a.append(5)
print(list_a)
print()
# 리스트 중간에 요소 추가하기
print("# 리스트 중간에 요소 추가하기")
list_a.insert(0,10)
print(list_a)
한번에 여러 요소를 추가하고 싶을 때는 extend()
함수를 사용한다.
리스트 형태
로 입력>>> list_a = [1,2,3]
>>> list_a.extend([4,5,6])
>>> print(list_a)
[1,2,3,4,5,6]
+
와 extend()
는 비슷한 형태로 동작하지만 +
는 비파괴적 처리
이고, extend()
는 파괴적 처리
이다.
>>> list_a = [1,2,3]
>>> list_b = [4,5,6]
>>> list_a+list_b
[1,2,3,4,5,6]
>>> print(list_a)
[1,2,3]
>>> print(list_b)
[4,5,6]
extend()
함수>>> list_a = [1,2,3]
>>> list_b = [4,5,6]
>>> list_a.extend(list_b)
>>> list_a
[1,2,3,4,5,6]
>>> list_b
[4,5,6]
앞에 입력했던 list_a
자체에 직접적인 변화가 있다.
list_a
에만 extend()
함수를 사용했으므로 list_b
에는 변화가 없다.
리스트는 용량이 매우 커질 위험을 대비해 제공된다.
인덱스
로 제거하기값
으로 제거하기del
키워드, pop()
del 키워드
: 리스트의 특정 인덱스에 있는 요소를 제거함del 리스트명[인덱스]
pop()
: 제거할 위치에 있는 요소를 제거함. 단, 매개변수를 입력하지 않으면 -1
이 들어가는 것으로 취급하여 마지막 요소를 제거
함리스트명.pop(인덱스)
소스코드 list03.py
list_a = [0,1,2,3,4,5]
print("# 리스트의 요소 하나 제거하기")
# del 키워드
del list_a[1]
print("del list_a[1]:", list_a)
# pop()
list_a.pop(2)
print("pop(2):", list_a)
[:]
연산자로 리스트 범위를 지정하여 여러 요소를 선택하는 것리스트[시작_인덱스:끝_인덱스:단계]
단계
란 사용하면 지정한 숫자만큼 인덱스를 건너뛰며
요소를 가져온다.
>>> numbers = [1,2,3,4,5,6,7,8]
>>> numbers[0:5:2]
[1, 3, 5]
>>> numbers = [1,2,3,4,5,6,7,8] # 시작 인덱스와 끝 인덱스는 자동으로 "전부"가 지정된다.
>>> numbers[::-1] # 단계가 -1이므로 반대로 출력한다.
[8, 7, 6, 5, 4, 3, 2, 1]
remove()
remove()
: 값을 지정해서 제거함리스트.remove(값)
예시
>>> list_c = [1,2,1,2]
>>> list_c.remove(2)
>>> list_c
[1, 1, 2]
remove()
함수는 리스트에 값이 여러 개 있어도 먼저 발견되는 값 하나만 제거된다.
리스트에 중복된 여러 개의 값을 모두 제거하려면 반복문
과 조합해서 사용해야 한다.
clear()
clear()
: 리스트 내부의 요소를 모두 제거함리스트.clear()
예시
>>> list_d = [0,1,2,3,4,5]
>>> list_d.clear()
>>> list_d
[] # 요소가 모두 제거됨
sort()
sort()
: 리스트 요소를 기본 오름차순으로 정렬한다.리스트.sort()
예시
>>> list_e = [52, 273, 1, 7, 32]
>>> list_e.sort()
>>> list_e
[1, 7, 32, 52, 273]
>>> list_e.sort(reverse=True) # 내림차순 정렬
>>> list_e
[273, 52, 32, 7, 1]
in/not in
연산자in 연산자
: 특정 값이 리스트 내부에 있는지 확인한다.값 in 리스트
예시>>> list_a = [52, 273, 1, 7, 32]
>>> 273 in list_a
True
>>> 99 in list_a
False
not in 연산자
: 리스트 내부에 해당 값이 없는지 확인한다.값 not in 리스트
예시>>> list_a = [52, 273, 1, 7, 32]
>>> 273 not in list_a
False
>>> 99 not in list_a
True
for
반복문반복문
: 컴퓨터에 반복을 지시하는 방법컴퓨터에 반복을 지시하는 방법은
복사
붙여넣기
for
반복문을 사용하면
print("출력")
print("출력")
print("출력")
print("출력")
print("출력")
이렇게 반복되는 긴 코드를
for i in range(100):
print("출력")
으로 사용할 수 있으며 "출력"
문자열을 100
번 출력하게 된다.
range()
는 for
반복문과 함께 많이 사용되는 범위 자료형
이다.
for
반복문: 리스트와 함께 사용하기for 반복문
의 기본 형태는 다음과 같다.
for 반복자 in 반복할 수 있는 것:
코드
반복할 수 있는 것에는
리스트
등이 있다.
이 중 리스트와 조합해서 for 반복문
을 사용해보자.
for
반복문과 리스트소스코드 for_list.py
# 리스트 선언
array = [273, 32, 103, 57, 52]
# 리스트에 반복문 적용
for element in array:
# 출력
print(element)
array
에 있는 요소 하나하나가 element
라는 변수에 들어가며 각각의 요소를 출력하게 된다.
for
반복문과 문자열for 반복문
은 문자열과 함께 사용할 수도 있다.
for character in "안녕하세요":
print("-", character)
(누적 예제)
중첩 반복문
: 반복문을 여러 겹 중첩해 사용한 형태n-차원
처리를 할 때 사용1차원 리스트
: 리스트가 한 겹으로 감싸진 리스트[1, 2, 3]
2차원 리스트
: 리스트가 두 겹으로 감싸진 리스트[[1, 2, 3],[4, 5, 6]]
n-차원
리스트 요소를 모두 확인하려면 반복문을 n번 중첩
해야 한다.다음과 같은 리스트가 있을 때 list_of_list
의 요소를 출력하려면 어떻게 작성해야 하는가?
실행 결과를 보고 예측한 뒤 소스코드를 짜보자.
list_of_list = [
[1,2,3],
[4,5,6,7],
[8,9]
]
# 실행 결과
1
2
3
4
5
6
7
8
9
나는 이렇게 코드를 짜 보았다.
list_of_list = [[1,2,3],[4,5,6,7],[8,9]]
for lists in list_of_list:
for list in lists:
print(list)
중첩 리스트
안에 있는 리스트들을 lists
에 담은 후
lists
리스트 안에 있는 요소들 하나하나를 list
에 담아 출력하였다.
[좀 더 알아보기]
전개 연산자전개 연산자 (*)
: 전개연산자를 사용하면 리스트 내용을 전개
하여 입력할 수 있다.*리스트 -> 리스트[0], 리스트[1] ...
전개 연산자를 사용하는 위치는
에 주로 사용한다.
a
리스트 요소가 1
2
3
4
일 때 b
리스트 내부에 *a
라고 입력하면 1,2,3,4
라고 입력한 것과 같은 효과를 낸다.
>>> a = [1,2,3,4]
>>> b = [*a,*a]
>>> b
[1,2,3,4,1,2,3,4]
또한 리스트에 요소를 추가할 때 코드를 비파괴적
으로 구현할 수 있다.
리스트 안에 사용하는 것과 마찬가지로 리스트 요소를 하나하나 입력하는 것처럼 전개된다.
>>> a = [1,2,3,4]
>>> print(*a)
1 2 3 4
리스트
는 여러 가지 자료를 저장할 수 있는 자료형을 말한다.요소
는 리스트 내부에 있는 각각의 내용을 의미한다.인덱스
는 리스트 내부에서 값의 위치를 의미한다.for 반복문
은 특정 코드를 반복해서 실행할 때 사용하는 기본적인 구문이다.list_a = [0,1,2,3,4,5,6,7]
입니다. 다음 표의 함수들을 실행했을 때 list_a
의 결과가 어떻게 나오는지 적어 보세요.함수 | list_a 의 값 |
---|---|
list_a.extend(list_a) | [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] |
list_a.append(10) | [0,1,2,3,4,5,6,7,10] |
list_a.insert(3, 0) | [0,1,2,0,3,4,5,6,7] |
list_a.remove(3) | [0,1,2,4,5,6,7] |
list_a.pop(3) | [0,1,2,4,5,6,7 |
list_a.clear() | [] |
# 실행결과
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
# 실행결과
i = 0, j = 1
i = 1, j = 3
i = 2, j = 5
i = 3, j = 7
[1, 4, 3, 16, 5, 36, 7, 64, 9]
자료형 | 의미 | 가리키는 위치 | 선언 형식 |
---|---|---|---|
리스트 | 인덱스를 기반으로 값을 저장 | 인덱스 | 변수 = [] |
딕셔너리 | 키를 기반으로 값을 저장 | 키 | 변수 = {} |
딕셔너리
예시
{ #키 값
"키A": 10, # 문자열을 키로 사용하기
"키B": 20,
"키C": 30,
1: 40, # 숫자를 키로 사용하기
False: 50 # 불을 키로 사용하기
}
중괄호 {}
로 선언하며, 키: 값
형태를 쉼표 ,
로 연결해서 만든다.문자열
숫자
불
등으로 선언할 수 있다.# 선언 방법
변수 = {
키: 값,
키: 값,
...
키: 값
}
# 예시
>>> dict_a = {
... "name": "어벤저스 엔드게임",
... "type": "히어로 무비"
... }
# 예시 출력
>>> dict_a
{'name': '어벤저스 엔드게임', 'type': '히어로 무비'}
구분 | 선언 형식 | 사용 예 | 틀린 예 |
---|---|---|---|
리스트 | list_a = [] | list_a[1] | |
딕셔너리 | dict_a = {} | dict_a["name"] | dict_a{"name"} |
# 예시
>>> dict_a["name"]
'어벤저스 엔드게임'
>>> dict_a["type"]
'히어로 무비'
다양한 자료를 넣을 수도 있다.
>>> dict_b = {
... "director": ["안소니 루소", "조 루소"]
... "cast": ["아이언맨", "타노스", "토르", "닥터스트레인지", "헐크"]
... }
# 출력
>>> dict_b
{'director': ['안소니 루소', '조 루소'], 'cast': ['아이언맨', '타노스', '토르', '닥터스트레인지', '헐크']}
>>> dict_b["director"]
['안소니 루소', '조 루소']
소스코드 dict01.py
# 딕셔너리 선언
dictionary = {
"name": "7D 건조 망고",
"type": "당절임",
"ingredient": ["망고", "설탕", "메타중아황산나트륨", "치자황색소"],
"origin": "필리핀"
}
# 출력
print("name:", dictionary["name"])
print("type:", dictionary["type"])
print("ingredient:", dictionary["ingredient"])
print("origin:", dictionary["origin"])
print()
# 값 변경
dictionary["name"] = "8D 건조 망고"
print("name:", dictionary["name"])
위처럼 딕셔너리는 여러 개의 자료를 가지고 있는 리스트
이기도 하다.
따라서 인덱스를 지정하여 리스트 안의 특정 값을 출력할 수도 있다.
>>> dictionary["ingredient"]
['망고', '설탕', '메타중아황산나트륨', '치자황색소']
>>> dictionary["ingredient"][1]
'설탕'
(예외 처리)
NameError
: 이름이 정의되지 않았다는 오류따옴표 없이
단순하게 식별자를 입력하면 이를 변수를 인식하기 때문에 발생하는 예외>>> dict_key = {
... name: "7D 건조 망고",
... type: "당절임"
... }
name
에 ""
를 사용하지 않아 단순 변수로 인식하여 발생한 오류
/
제거하기딕셔너리에 값을 추가
할 때는 키를 기반으로
값을 입력하면 된다.
딕셔너리[새로운 키] = 새로운 값
# 예시
>>> dictionary = {
"name": "7D 건조 망고",
"origin": "필리핀"
}
>>> dictionary["price"] = 5000
>>> dictionary
{'name': '7D 건조 망고', 'origin': '필리핀', 'price': 5000} # price 키가 추가되었다.
소스코드 dict02.py
# 딕셔너리 선언
dict = {}
# 요소 추가 전 내용 출력
print("요소 추가 이전:", dict)
# 딕셔너리에 요소 추가
dict["name"] = "새로운 이름"
dict["head"] = "새로운 정신"
dict["body"] = "새로운 몸"
# 출력
print("요소 추가 이후:", dict)
딕셔너리 요소를 제거
할 때는 del 키워드
를 사용하여 특정 키를 지정하면 된다.
# 예시
>>> del dictionary["name"]
>>> dictionary
{'origin': '필리핀', 'price': 5000}
소스코드 dict03.py
# 딕셔너리 선언
dict = {
"name": "새로운 이름",
"head": "새로운 정신",
"body": "새로운 몸"
}
# 요소 제거 전 내용 출력
print("요소 제거 이전:", dict)
# 딕셔너리의 요소 제거
del dict["name"]
del dict["head"]
del dict["body"]
# 요소 제거 후의 내용 출력
print("요소 제거 이후:", dict)
KeyError
예외dict = {}
dict["Key"]
방금처럼 딕셔너리에 존재하지 않는 키에 접근하면 KeyError
가 발생하게 된다.
이러한 예외를 막기 위해 in 키워드
와 get() 함수
가 필요하다.
in
키워드소스코드 key_in.py
# 딕셔너리 선언
dictionary = {
"name": "이름",
"type": "타입"
}
# 사용자로부터의 입력
key = input("> 접근하고자 하는 키: ")
# 출력
if key in dictionary:
print(dictionary[key])
else:
print("존재하지 않는 키에 접근하고 있습니다.")
get()
함수KeyError
를 발생시키지 않고 None
을 출력한다.None
을 출력하는지 확인하기소스코드 get01.py
# 딕셔너리 선언
dictionary = {
"name": "이름",
"type": "타입"
}
# 존재하지 않는 키에 접근
value = dictionary.get("존재하지 않는 키")
print("값:", value)
# None 확인 방법
if value == None:
print("존재하지 않는 키에 접근했었습니다.")
for
반복문:
딕셔너리와 함께 사용하기for
반복문과 딕셔너리를 조합해서 상요하면 다음과 같은 형태가 된다.
for 키 변수 in 딕셔너리:
코드
[주의!]
딕셔너리 내부에 있는 키가 변수에 들어감을 알자.for
반복문과 딕셔너리소스코드 for_dict.py
# 딕셔너리 선언
dictionary = {
"name": "7D 건조 망고",
"type": "당절임",
"ingredient": ["망고", "설탕", "메타중아황산나트륨", "치자황색소"],
"origin": "필리핀"
}
# for 반복문 사용
for key in dictionary:
# 출력
print(key, ":", dictionary[key])
딕셔너리
는 키를 기반으로 여러 자료를 저장하는 자료형이다.키
는 딕셔너리 내부에서 값에 접근할 때 사용하는 것이다.값
은 딕셔너리 내부에 있는 각각의 내용을 의미한다.[04-3]
범위 자료형과 while
반복문for
반복문과 함께 사용되는 자료형은 범위 range
도 있다.
사용하는 방법은
이 있다.
정수로 이루어진 범위를 만들 때는 range()
함수를 사용한다.
0
부터 A-1
까지의 정수로 범위를 만든다.
range(A)
>>> a = range(5)
>>> a
range(0, 5)
A
부터 B-1
까지의 정수로 범위를 만든다.
range(A, B)
A
부터 B-1
까지의 정수로 범위를 만드는데, 앞뒤의 숫자가 C
만큼의 차이를 가진다.
range(A, B, C)
list()
함수를 이용해 범위를 리스트로 변경하면 범위 내부에 어떤 값이 들어 있는지 확인할 수 있다.
>>> list(range(5))
[0, 1, 2, 3, 4]
만약 매개변수로 나눗셈을 사용한 경우, TypeError
가 발생한다.
>>> n = 10
>>> a = range(0, n/2)
/
를 사용할 경우 부동소수점
이 나올 수 있어 TypeError
가 발생한다. 정수
만 나와야 하기 때문에 보통은 정수 나누기 연산자인 //
를 사용한다.
for
반복문: 범위와 함께 사용하기for
반복문과 범위를 조합해서 사용하면 다음과 같은 형태가 된다.
for 숫자 변수 in 범위:
코드
for
반복문과 범위소스코드 for_range.py
for i in range(5):
print(str(i) + "= 반복 변수")
print()
for i in range(5, 10):
print(str(i) + "= 반복 변수")
print()
for i in range(0, 10, 3):
print(str(i) + "= 반복 변수")
print()
for
반복문: 리스트와 범위 조합하기반복을 할 때 몇 번째인지를 알아내고 싶다면?
범위를 조합해서 사용
한다.