Welcome! Everything is fine.

[1주차] Python 100 문제풀이 Part.2 - 배열 본문

자격증 및 기타 활동/여름방학 스터디(Python)

[1주차] Python 100 문제풀이 Part.2 - 배열

개발곰발 2021. 7. 7.
728x90

📌 여름방학 스터디 시작

목표

1) 인프런 <예제로 공부하는 Python 100 문제풀이> 강의 완강하기

2) Python과 관련된 개념을 블로그에 정리하고 공유하기

3) 문제풀이를 통해 코딩테스트 대비하기

계획

날짜 공부 범위
21.07.01 ~ 21. 07.08 Python 100 문제풀이 Part.2 - 배열
21.07.08 ~ 21.07.15 Python 100 문제풀이 Part.2 - 함수
21.07.015 ~ 21. 07.22 Python 100 문제풀이 Part.3 - OOP
21.07.22 ~ 21.07.29 Python 100 문제풀이 Part.3 - 모듈
21.07.29 ~ 21.08.05 Python 100 문제풀이 Part.3 - 알고리즘/문자열

💡 컬렉션 자료형 4가지

1)  리스트(list) : 순서가 있고 요소를 추가하거나 삭제하는 등 수정이 가능하다. 대괄호[ ]로 표현한다.

2)  튜플(tuple) : 순서가 있지만 한번 작성하면 수정할 수 없다. 소괄호( )로 표현한다.

3)  집합(set) : 순서가 없고 중복을 허용하지 않는다. 중복 된 값을 자동으로 걸러내기 때문에 어떤 리스트에서 중복된 값을 제거하는 역할로 사용할 수도 있다. 중괄호{ }로 표현하는 것은 딕셔너리와 같지만 key값이 없다.

4)  딕셔너리(dict) : 순서는 없지만 수정할 수 있다. 중괄호{ }안에 key 값과 value 값을 넣어 표현한다. 

💡 리스트(list)

리스트란?

다양한 데이터 값(정수, 실수, 문자열, 튜플...등)을 담는 바구니다.

리스트의 특징

- 순서가 있으며, 수정이 가능하다.

- 리스트 안에 또 다른 리스트를 요소로써 가질 수 있다.

- 중복된 값을 가질 수 있다.

- 파이썬 내부에서 하나의 타입이므로, type()함수로 리스트 타입을 출력하면 list라고 나온다.

- 리스트의 각 요소에는 인덱스 번호가 0부터 붙여지므로 그 인덱스 번호를 사용해서 접근하고 출력시에도 사용한다.

 

❔ 문제 : 정수형, 실수형, 문자형 리스트를 생성하는 예제를 만들어보시오.

a = [1, 2, 3, 4, 5]
b = [1.0, 2.0, 3.0, 4.0, 5.0]  # 0쓰지않고 .만 써도 실수로 출력됨
c = ['a', 'b', 'c', 'd', 'e']

❔ 문제 : 파이썬 리스트 생성시 서로 다른 데이터 자료형 값을 사용하여 만들어보시오.

a =  [1, 2, 3, 4, 5, ['a', 'b', 'c']]
b = [100, 3.14, 'korea', [1, 2, 3]] 
c = [1, 2, 3, [1, 2, 3], (1, 2, 3)] 
d = [100, 3.14, 'korea', [1, 2, 3, 3], (1, 2, 3, 3), {1, 2, 3}, {'a': 100, 'b': 200, 'c': 300}]

빈 리스트를 생성하는 법

a = []
b = list()

❔ 문제 : 인덱스를 이용하여 리스트 요소에 접근하고 해당 요소 값을 출력해보시오.

a = [100, 200, 300, 400, 500]
print(a[0],a[1],a[2],a[3],a[4])

❔ 문제 : 아래의 리스트에서 korea, 365, 400 이라는 값이 출력되도록 작성하시오.

a = [100, 3.14, 'korea', [1, 2, 3, 365], (100, 200, 300, 400, 500)]
print(a[2])
print(a[3][3])
print(a[4][3])

❔ 문제 : 역인덱스를 사용하여 리스트 요소의 마지막 부터 거꾸로 출력되도록 구현하시오.

a = [100, 200, 300, 400, 500]
print(a[-1],a[-2],a[-3],a[-4],a[-5])  # 맨 끝부터 -1

❔ 문제 : 인덱스와 반복문을 사용하여 리스트 요소의 값들을 모두 출력하시오.

a = [100, 200, 300, 400, 500, [1, 2, 3], (4, 5, 6)]
for i in range(len(a)): # 배열의 길이 구할땐 len()함수 사용
	print(i, '=', a[i])

리스트 정렬하기

- sort( ), sorted( ) 함수를 사용하여 정렬한다.

- sort( ) : 원본 리스트를 바로 변경한다.

- sorted( ) : 사본을 변경한다.

- 정렬 디폴트는 오름차순이다. 내림차순으로 출력하려면 reverse옵션을 True로 바꿔야한다.

lst = [20, 40, 10, 60, 30]
lst.sort()	# 오름차순 정렬
lst.sort(reverse=True)	# 내림차순 정렬

❔ 문제 : 학생들의 영어 점수를 오름차순으로 출력하는 코드를 구현하시오.

eng_scores = [100, 40, 70, 90, 60]
eng_scores.sort()
print(eng_scores)

❔ 문제 : 역인덱스를 사용하여 영어 점수를 오름차순과 내림차순으로 출력시키시오.

eng_scores = [ 100, 40, 70, 90, 60 ]
eng_scores.sort()
for i in range(-len(eng_scores), 0):
	print(eng_scores[i],'(',i,')',end='\t')

리스트에 요소 추가, 수정, 삭제하기

1) 추가 : append( ) 함수를 사용한다.   ex) score.append(33)

2) 수정 : index에 새로운 값을 대입한다.  ex) score[-1] = 33

3) 삭제 : del과 index를 사용한다.  ex) del score[-1]

 

❔ 문제 : 학생들의 영어 점수 리스트에 새 전학생의 영어 점수를 추가하고 수정, 삭제해보시오.

eng_scores = [90, 60, 75, 100, 88]

# 추가
eng_scores.append(99)
print(eng_scores)

# 수정
eng_scores[-1] = 37
print(eng_scores)

# 삭제
del eng_scores[-1]
print(eng_scores)

리스트 병합하기

- 더하기 연산자(+)를 사용하여 병합한다. 

- 리스트 사이에서 곱하기 연산자(*)는 사용할 수 없지만, 리스트 * 숫자는 가능하다.

* 튜플도 더하기 연산자를 사용하여 병합할 수 있다.

* 집합은 더하기 연산자를 사용할 수 없으며, 중복이 안되기 때문에 곱하기 연산자 역시 사용할 수없다.

 

❔ 문제 : 2개의 리스트를 하나의 리스트로 묶는 병합 처리에 대한 코드를 구현하시오.

a = [0, 1, 2, 3, 4]
b = [5, 6, 7, 8, 9]
print(a+b)

리스트 안에 있는 요소의 인덱스 번호 출력하기

- index( )를 사용하여 접근한다.  ex) animal.index['lion']

 

❔ 문제 : 동물원에서 원하는 동물의 케이지(cage)를 찾아서 출력하는 코드를 구현하시오. 이때, 동물 이름은 사용자 입력으로 처리한다.

# <예상출력결과>
# 케이지를 알고 싶은 동물의 이름을 입력하세요 = hippo
# hippo 동물의 케이지는 1번 위치에 있습니다. 1번 케이지 약도를 출력하시겠습니까?

animals = ['elephant', 'hippo', 'lion', 'tiger', 'alligator']
animal = input('케이지를 알고싶은 동물의 이름을 입력하세요 : ')
cage = animals.index(animal)

print(animal + ' 동물의 케이지는 ' + str(cage) + '번 위치에 있습니다. ' + str(cage) + '번 케이지 약도를 출력 하시겠습니까?')
print( f'{animal} 동물의 케이지는 {cage}번 위치에 있습니다. {cage}번 케이지 약도를 출력하시겠습니까?') # 더 편하게 출력하기

리스트에 중복된 값을 제거하는 방법

- 중복 된 값을 허용하지 않는 것은? 바로 집합(set)!

- 리스트를 집합으로 바꿔 중복된 값을 제거 한 뒤, 다시 리스트로 바꾼다.

- set(중복된 리스트)  # 기존의 리스트를 집합으로 바꿔서 중복 제거(이때의 집합 타입은 요소가 순서없이 뒤죽박죽 정렬이 됨)

- list ( set(중복된 리스트) ) # 중복을 제거한 후 다시 리스트로 바꾸기

 

❔ 문제 : 리스트에 들어있는 동물중 중복된 동물을 제거하여 출력하시오.

lst = ['dog', 'hippo', 'elephant', 'lion', 'tiger', 'alligator', 'hippo', 'lion']
list(set(lst))

❔ 문제 : 아래의 자료구조에 접근시 에러가 나는 것은 무엇이고 그 이유를 설명해보시오.

# [1] : 리스트
a = [ 'dog', 'hippo', 'elephant', 'lion', 'tiger', 'alligator', 'hippo', 'lion' ]
print( '[1] lion 출력하기 : ', a[3] )

# [2] : 집합
b = set( a )
print( '[2] lion 출력하기 : ', b[3] )

 

✔ [2]번이 에러가 난다. 집합(set)타입은 순서가 없기 때문에 인덱스로 접근할 수 없다.

 

리스트 컴프리헨션(list comprehension) : 리스트를 간단하게 만들 수 있도록 제공하는 방법

- 리스트 컴프리헨션을 사용하면 리스트를 더욱 간단하게 만들 수 있어 유용하다.

 

수동으로 리스트를 생성한다면

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

이렇게 원소를 일일히 적어주어야한다.

 

혹은 for 반복문을 이용하여 빈 리스트에 append하는 방식으로로 가능하다.

a =[]
for i in range(1,11):
	a.append(i)
    if i == 10:
    	print(a)

위의 코드를 한줄로 간단하게 작성할 수 있는데, 그것이 리스트 컴프리헨션이다.

a = [i for i in range(1,11)]
print(a)

❔ 문제 : 아래의 다양한 list comprehension 문제들을 코드로 구현하시오.

 [1] list comprehension 괄호([])를 사용하지 않고 list() 와 for 문으로 1~10까지의 리스트를 만들어보시오.

a = list(i for i in range(1,11))
print(a)

 [2] 1~10까지의 수를 list comprehension으로 각 숫자를 제곱한 값을 저장하는 리스트를 만들어보시오.

# 방법1
a1 =[]
for i in range(1,11):
    b1.append(i**2)
    if i == 10:
        print(b1)
        
# 방법2
a2 = [i ** 2 for i in range(1,11)]
print(b2)

# 방법3
a3 =[pow(i, 2) for i in range(1,11)]  # pow(밑,지수)함수를 이용해 제곱근 구하기
print(b3)

 [3] 위 2번 문제에서 5의 제곱 값은 제외하고 출력시키시오.

a = [i**2 for i in range(1,11) if i != 5]

 [4] if 조건문을 사용하여 1~50까지의 수에서 짝수, 홀수만 저장하는 리스트를 각각 만들어보시오.

# 홀수
a1 =[]
for i in range(1,51):
    if i % 2 != 0:
        lst1.append(i)
        if i >= 49:
            print(a1)

# 짝수
a2 =[]
for i in range(1,51):
    if i % 2 == 0:
        lst2.append(i)
        if i >= 50:
            print(a2)

중첩 for 반복문 사용법

❔ 문제 : a = [ i, j for i in range(3) for j in range(3)] 왼쪽의 list comprehension 결과를 말해보시오.

✔ 에러가 난다. 에러가 나지 않게 하려면 아래와 같이 튜플 형태로 묶어 주어야 한다.

a = [(i,j) for i in range(3) for j in range(3)]

위 코드를 출력하면 역시 아래와 같이 튜플형태로 출력된다.

# 출력결과
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

💡 딕셔너리(dict)

딕셔너리란?

키(key)와 값(value)이 하나의 쌍으로 이루어진 데이터 값이다.  {key : value} 

딕셔너리의 특징

- 순서가 없고, value값 수정이 가능하다.

- 입력한 데이터 값에 접근할 때는 key를 사용하여 접근한다. (index를 이용한 접근 불가능)

- key 값은 중복으로 입력은 가능하나 기존 값이 대체되어 출력되며 변경이 불가능하다. 중복도 안되고 변경도 불가능. - - value값은 중복이 가능하고 변경도 가능하다.

- 숫자, 문자 외에도 리스트와 같은 배열 객체로도 데이터 입력이 가능하다.

딕셔너리 선언

dict = {}

데이터 입력

dict['name'] = '홍길동'
dict['age'] = 25
dict['hp'] = '010-1234-5678'
dict['address'] = '서울시 어쩌구 어쩌구동'

데이터 출력

key값으로 value값에 접근한다. 아래와 같은 경우에는 '홍길동'이 출력될 것이다.

print(dict['name'])

반복문을 사용한 출력 - key만 출력

for i in dict.keys():

반복문을 사용한 출력 - value만 출력

for i in dict.values():

key, value 모두 출력

key와 value를 모두 출력할 경우, 튜플 형태로 출력된다.

for i in dict.items():

빈 딕셔너리 생성하는 법

a = dict()
b = {}

가독성

dict = {
		'name' : '홍길동',
		'age' : 25
		'hp' : '010-1234-5678'
		'address' : '서울시 어쩌구 어쩌구동'
}

중첩 딕셔너리(Nested Dictionary)

딕셔너리 안에 다시 딕셔너리가 들어갈 수 있다.

dict = {
			'name' : '홍길동',
			'age' : 25
			'pastime' : {
                                 'reading' : 30,
                                 'walking' : 60
}
}

중첩 딕셔너리에는 아래와 같이 접근한다.

print(dict[pastime])	# key와 value 모두 출력됨
print(dict[pastime][reading])	# reading의 value값이 출력됨

딕셔너리에 요소 추가, 수정, 삭제하기

dict['age'] = 22	# 삽입

dict['age'] = 33	# 수정

del dict['age']		# 삭제

📌 다음주 계획

- <Python 100 문제풀이 Part.2 - 함수> 강의 듣기

- <Jump To Java> 04장 공부하기

- 생활코딩 WEB1 공부하기