[Python] 혼공단_3주차_Chapter 04

Haeun Noh·2023년 1월 24일
0
post-thumbnail

0120


기본 미션 : 리스트, 딕셔너리, 범위 자료형에 대해 이해한 내용을 바탕으로 포스팅하기

선택 미션 : 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]

각각의 요소는 다음과 같이 저장된다.

27332103문자열TrueFalse
[0][1][2][3][4][5]
  • 인덱스 [] : 리스트 기호인 [] 안에 들어간 숫자

리스트 요소 변경

리스트 요소는 변경할 수 있다. 다음과 같이 입력해보자.

>>> list_a = [273, 24, 103,"문자열",True,False]
>>> list_a[0] = "변경"
>>> list_a
['변경', 24, 103,'문자열',True,False]
'변경'32103문자열TrueFalse
[0][1][2][3][4][5]


다양한 리스트 사용 방법

  1. 대괄호 안에 음수를 넣어 뒤에서부터 요소 선택하기
    문자열의 뒤에서부터 문자를 선택할 수 있었던 것과 마찬가지로 뒤에서부터 요소를 선택할 수 있다.
    >>> list_a = [273, 24, 103,"문자열",True,False]
    >>> list_a[-1]
    False
    >>> list_a[-2]
    True
    >>> list_a[-3]
    '문자열'
    '변경'32103문자열TrueFalse
    [-6][-5][-4][-3][-2][-1]

  2. 리스트 접근 연산자를 다음과 같이 이중으로 사용하기
    >>> list_a = [273, 24, 103,"문자열",True,False]
    >>> list_a[3]
    '문자열'
    >>> list_a[3][0]
    '문'
    list_a3번째 방에 있는 문자열인 '문자열'에서 0번째에 있는 '문'을 출력한다.

3. 리스트 안에 리스트 사용하기
>>> 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_a3개의 리스트를 가지는 리스트가 된다.



리스트에서의 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 반복문

  • 반복문 : 컴퓨터에 반복을 지시하는 방법

컴퓨터에 반복을 지시하는 방법은

  1. 반복할 작업 내용이 있는 코드를 복사
  2. 원하는 만큼 붙여넣기

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] ...

전개 연산자를 사용하는 위치는

  • 리스트 내부
  • 함수의 매개변수

에 주로 사용한다.


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]

또한 리스트에 요소를 추가할 때 코드를 비파괴적으로 구현할 수 있다.


2. 함수 매개변수 위치에 사용하는 경우

리스트 안에 사용하는 것과 마찬가지로 리스트 요소를 하나하나 입력하는 것처럼 전개된다.

>>> a = [1,2,3,4]
>>> print(*a)
1 2 3 4


마무리 정리

  • 리스트는 여러 가지 자료를 저장할 수 있는 자료형을 말한다.
  • 요소는 리스트 내부에 있는 각각의 내용을 의미한다.
  • 인덱스는 리스트 내부에서 값의 위치를 의미한다.
  • for 반복문은 특정 코드를 반복해서 실행할 때 사용하는 기본적인 구문이다.


선택 미션 : p. 213쪽의 1번 문제의 답 쓰고 인증하기

1. 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()[]

2. 100 이상의 숫자만 출력하기


3-1. 홀수 짝수 분간하기


3-2. 자릿수 맞추기


4. 실행 결과처럼 출력되도록 완성하기

# 실행결과
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]


5. 짝수 번째 요소를 제곱하여 실행 결과처럼 출력되도록 완성하기

# 실행결과
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도 있다.

사용하는 방법은

  1. 매개변수에 숫자 한 개를 넣는 방법
  2. 매개변수에 숫자 두 개를 넣는 방법
  3. 매개변수에 숫자 세 개를 넣는 방법

이 있다.


범위

정수로 이루어진 범위를 만들 때는 range() 함수를 사용한다.

1. 매개변수에 숫자를 한 개 넣는 방법

0부터 A-1까지의 정수로 범위를 만든다.

range(A)
>>> a = range(5)
>>> a
range(0, 5)

2. 매개변수에 숫자를 두 개 넣는 방법

A부터 B-1까지의 정수로 범위를 만든다.

range(A, B)

3. 매개변수에 숫자를 세 개 넣는 방법

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 반복문: 리스트와 범위 조합하기

반복을 할 때 몇 번째인지를 알아내고 싶다면?
범위를 조합해서 사용한다.


✏️직접 해보는 손코딩_

profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글