- 리스트
- for 반복문
- 사전
- 파이썬 데이터의 비밀
리스트
# 리스트 (list)
numbers = [2, 3, 5, 7, 11, 13]
names = ["윤수", "혜린", "태호", "영훈"]
# 인덱싱 (indexing)
print(names[1])
print(numbers[1] + numbers[3])
print(numbers[-1])
print(numbers[-2])
print(numbers[-6])
print(numbers[-7])
혜린
10
13
11
2
IndexError: list index out of range
# 리스트 (list)
numbers = [2, 3, 5, 7, 11, 13]
names = ["윤수", "혜린", "태호", "영훈"]
# 리스트 슬라이싱 (list slicing)
print(numbers[0:4])
print(numbers[2:])
print(numbers[:3])
new_list = numbers[:3] # [2, 3, 5]
print(new_list[2])
[2, 3, 5, 7]
[5, 7, 11, 13]
[2, 3, 5]
5
# 리스트 (list)
numbers = [2, 3, 5, 7, 11, 13]
names = ["윤수", "혜린", "태호", "영훈"]
numbers[0] = 7
print(numbers)
[7, 3, 5, 7, 11, 13]
리스트 함수
numbers = []
print(len(nembers)) # 리스트 안에 몇 개의 값이 있는지 알고 싶을 때, len 함수를 사용
0
numbers = []
numbers.append(5)
numbers.append(8) # 가장 오른쪽 끝에 추가함
print(numbers)
print(len(numbers))
[5, 8]
2
numbers = [2, 3, 5, 7, 11, 13, 17, 19]
del numbers[3]
print(numbers)
[2, 3, 5, 11, 13, 17, 19]
numbers = [2, 3, 5, 7, 11, 13, 17, 19]
numbers.insert(4, 37) # 4번 인덱스에 37을 삽입
[2, 3, 5, 7, 37, 11, 13, 17, 19]
리스트 정렬
numbers = [19, 13, 2, 5, 3, 11, 7, 17]
new_list = sorted(numbers)
print(new_list)
[2, 3, 5, 7, 11, 13, 17, 19]
numbers = [19, 13, 2, 5, 3, 11, 7, 17]
new_list = sorted(numbers, reverse = True)
print(new_list)
[19, 17, 13, 11, 7, 5, 3, 2]
numbers = [19, 13, 2, 5, 3, 11, 7, 17]
new_list = sorted(numbers, reverse = True)
print(numbers)
[19, 13, 2, 5, 3, 11, 7, 17] # sorted함수는 기존의 리스트를 전혀 건드리지 않는다!
numbers = [19, 13, 2, 5, 3, 11, 7, 17]
print(numbers.sort())
None
sort는 아무것도 리턴하지 않는다. 그 대신 numbers 리스트 자체를 정렬한다.
그러므로 정렬된 리스트를 보고 싶으면
numbers = [19, 13, 2, 5, 3, 11, 7, 17]
numbers.sort()
print(numbers)
[2, 3, 5, 7, 11, 13, 17, 19]
numbers.sort()를 하고 numbers를 print 해야 하는 것이다.
numbers = [19, 13, 2, 5, 3, 11, 7, 17]
numbers.sort(reverse = True)
print(numbers)
[19, 17, 13, 11, 7, 5, 3, 2]
정리
- sorted : 기존 리스트는 건드리지 않고, 정렬된 새로운 리스트를 리턴
- sort : 아무것도 리턴하지 않고, 기존 리스트를 정렬
실습과제: 리스트 인덱싱 연습
greetings = ["안녕", "니하오", "곤니찌와", "올라", "싸와디캅", "헬로", "봉주르"]
greetings 리스트의 원소를 모두 출력하는 프로그램을 작성해 보세요. while문과 리스트의 개념을 활용하시면 됩니다.
출력하면 아래와 같은 결과물이 나와야 합니다.
안녕
니하오
곤니찌와
올라
싸와디캅
헬로
봉주르
greetings = ["안녕", "니하오", "곤니찌와", "올라", "싸와디캅", "헬로", "봉주르"]
# 코드를 작성하세요.
i = 0
while i < len(greetings):
print(greetings[i])
i += 1
실습과제: 온도 단위 바꾸기
화씨 온도(°F)를 섭씨온도(°C)로 바꾸어주는 프로그램을 만들려고 합니다.
섭씨와 화씨의 관계식은 다음과 같습니다:
화씨온도를 섭씨온도로 변환해 주는 함수 fahrenheit_to_celsius를 써 보세요. 이 함수를 파라미터로 화씨온도 fahrenheit를 받고, 변환된 섭씨온도를 리턴합니다.
위 프로그램을 실행하면 아래처럼 출력되어야 합니다.
화씨 온도 리스트: [40, 15, 32, 64, -4, 11]
섭씨 온도 리스트: [4.4, -9.4, 0.0, 17.8, -20.0, -11.7]
모범 답안
# 화씨 온도에서 섭씨 온도로 바꿔 주는 함수
def fahrenheit_to_celsius(fahrenheit):
return (fahrenheit - 32) * 5 / 9
temperature_list = [40, 15, 32, 64, -4, 11]
print("화씨 온도 리스트: " + str(temperature_list)) # 화씨 온도 출력
# 리스트의 값들을 화씨에서 섭씨로 변환하는 코드
i = 0
while i < len(temperature_list):
temperature_list[i] = round(fahrenheit_to_celsius(temperature_list[i]), 1)
i += 1
print("섭씨 온도 리스트: {}".format(temperature_list)) # 섭씨 온도 출력
실습과제: 환전 서비스
제가 구매하고 싶은 물건들의 가격을 리스트에 정리해 놨습니다.
prices = [34000, 13000, 5000, 21000, 1000, 2000, 8000, 3000]
가격의 단위는 모두 원화(₩)인데요. 이 물건들의 가격을 미국 달러($)로 하면 얼마일지, 그리고 일본 엔화(¥)로 하면 얼마일지 확인해 보려고 합니다.
해야 할 일
우리가 해야 할 일은 크게 두 가지입니다.
- 함수 작성
- 반복문을 통해 리스트 요소들 변환
1. 함수 작성
먼저 한국 원화를 미국 달러로 변환해 주는 krw_to_usd 함수, 그리고 미국 달러를 일본 엔화로 변환해 주는 usd_to_jpy 함수를 써야 하는데요. krw_to_usd 함수는 파라미터로 원화 krw을 받아서 변환된 미국 달러 액수를 리턴해 줍니다. 마찬가지로 usd_to_jpy 함수는 파라미터로 달러 usd를 받아서 변환된 일본 엔화 액수를 리턴해 주는 거죠.
참고로 환율은 1달러에 1,000원, 그리고 1,000엔에 8달러라고 가정합니다.
2. 반복문을 통해 리스트 요소들 변환
반복문을 사용해서 리스트의 요소들을 각각 다른 화폐로 변환해야 하는데요. 그 과정에서 krw_to_usd 함수와 usd_to_jpy 함수를 활용하면 되겠죠?
위 코드를 완성하고 실행하면 아래와 같이 출력됩니다.
한국 화폐: [34000, 13000, 5000, 21000, 1000, 2000, 8000, 3000]
미국 화폐: [34.0, 13.0, 5.0, 21.0, 1.0, 2.0, 8.0, 3.0]
일본 화폐: [4250.0, 1625.0, 625.0, 2625.0, 125.0, 250.0, 1000.0, 375.0]
나의 답안
# 원화(₩)에서 달러($)로 변환하는 함수
def krw_to_usd(krw):
# 코드를 입력하세요.
return krw * 0.001
# 달러($)에서 엔화(¥)로 변환하는 함수
def usd_to_jpy(usd):
# 코드를 입력하세요.
return usd * (1000/8)
# 원화(₩)으로 각각 얼마인가요?
prices = [34000, 13000, 5000, 21000, 1000, 2000, 8000, 3000]
print("한국 화폐: " + str(prices))
# prices를 원화(₩)에서 달러($)로 변환하기
# 코드를 입력하세요.
i = 0
while i < len(prices):
prices[i] = round(krw_to_usd(prices[i]), 1)
i += 1
# 달러($)로 각각 얼마인가요?
print("미국 화폐: " + str(prices))
# prices를 달러($)에서 엔화(¥)으로 변환하기
# 코드를 입력하세요.
i = 0
while i < len(prices):
prices[i] = round(usd_to_jpy(prices[i]), 1)
i += 1
# 엔화(¥)으로 각각 얼마인가요?
print("일본 화폐: " + str(prices))
모범 답안
# 원화(₩)에서 달러($)로 변환하는 함수
def krw_to_usd(krw):
return krw / 1000 # 1,000원 당 1달러
# 달러($)에서 엔화(¥)로 변환하는 함수
def usd_to_jpy(usd):
return usd / 8 * 1000
# 원화(₩)로 각각 얼마인가요?
prices = [34000, 13000, 5000, 21000, 1000, 2000, 8000, 3000]
print("한국 화폐: " + str(prices))
# prices를 원화(₩)에서 달러($)로 변환하기
i = 0
while i < len(prices):
prices[i] = krw_to_usd(prices[i])
i += 1
# 달러($)로 각각 얼마인가요?
print("미국 화폐: " + str(prices))
# prices를 달러($)에서 엔화(¥)로 변환하기
i = 0
while i < len(prices):
prices[i] = usd_to_jpy(prices[i])
i += 1
# 엔화(¥)로 각각 얼마인가요?
print("일본 화폐: " + str(prices))
실습과제: 리스트 함수 활용하기
리스트 함수를 활용하여 아래의 지시 사항을 따르세요.
- numbers라는 빈 리스트를 만들고 리스트를 출력한다.
- append를 이용해서 numbers에 1, 7, 3, 6, 5, 2, 13, 14를 순서대로 추가한다. 그 후 리스트를 출력한다.
- numbers 리스트의 원소들 중 홀수는 모두 제거한다. 그 후 다시 리스트를 출력한다.
- numbers 리스트의 인덱스 0 자리에 20이라는 수를 삽입한 후 출력한다.
- numbers 리스트를 정렬한 후 출력한다.
실행 결과
[]
[1, 7, 3, 6, 5, 2, 13, 14]
[6, 2, 14]
[20, 6, 2, 14]
[2, 6, 14, 20]
나의 답안
# 빈 리스트 만들기
numbers = []
print(numbers)
# numbers에 값들 추가
# 코드를 입력하세요
numbers.append(1)
numbers.append(7)
numbers.append(3)
numbers.append(6)
numbers.append(5)
numbers.append(2)
numbers.append(13)
numbers.append(14)
print(numbers)
# numbers에서 홀수 제거
# 코드를 입력하세요
del numbers[0]
del numbers[0]
del numbers[0]
del numbers[1]
del numbers[2]
print(numbers)
# numbers의 인덱스 0 자리에 20이라는 값 삽입
# 코드를 입력하세요
numbers.insert(0, 20)
print(numbers)
# numbers를 정렬해서 출력
# 코드를 입력하세요
numbers.sort()
print(numbers)
모범 답안
# 빈 리스트 만들기
numbers = []
print(numbers)
# numbers에 값들 추가
numbers.append(1)
numbers.append(7)
numbers.append(3)
numbers.append(6)
numbers.append(5)
numbers.append(2)
numbers.append(13)
numbers.append(14)
print(numbers)
# numbers에서 홀수 제거
i = 0
while i < len(numbers):
if numbers[i] % 2 == 1:
del numbers[i]
else:
i += 1
print(numbers)
# numbers의 인덱스 0 자리에 20이라는 값 삽입
numbers.insert(0, 20)
print(numbers)
# numbers를 정렬해서 출력
numbers.sort()
print(numbers)
리스트 꿀팁
리스트에서 값의 존재 확인하기
어떤 값이 리스트에 있는지 확인하는 함수를 써보겠습니다.
# value가 some_list의 요소인지 확인
def in_list(some_list, value):
i = 0
while i < len(some_list):
# some_list에서 value를 찾으면 True를 리턴
if some_list[i] == value:
return True
i = i + 1
# 만약 some_list에서 value를 발견하지 못했으면 False를 리턴
return False
# 테스트
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23]
print(in_list(primes, 7))
print(in_list(primes, 12))
True
False
쓰는데 아주 어렵지는 않습니다. 하지만 리스트에 값의 존재를 확인하는 것은 너무 자주 있는 일이라서 파이썬에 이미 이 기능이 내장되어 있습니다. in이라는 키워드를 쓰면 됩니다.
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23]
print(7 in primes)
print(12 in primes)
True
False
거꾸로 값이 없는지 확인하려면 in 앞에 not을 붙이면 됩니다.
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23]
print(7 not in primes)
print(12 not in primes)
False
True
리스트 안의 리스트 (Nested List)
리스트 안에는 또 다른 리스트가 있을 수 있습니다. 이를 영어로 nested list라고 부릅니다.
# 세 번의 시험을 보는 수업
grades = [[62, 75, 77], [78, 81, 86], [85, 91, 89]]
# 첫 번째 학생의 성적
print(grades[0])
# 세 번째 학생의 성적
print(grades[2])
# 첫 번째 학생의 첫 번째 시험 성적
print(grades[0][0])
# 세 번째 학생의 두 번째 시험 성적
print(grades[2][1])
# 첫 번째 시험의 평균
print((grades[0][0] + grades[1][0] + grades[2][0]) / 3)
[62, 75, 77]
[85, 91, 89]
62
91
75.0
sort 메소드
저번에 정렬된 새로운 리스트를 리턴 시켜주는 sorted 함수를 보여드렸습니다. some_list.sort()는 새로운 리스트를 생성하지 않고 some_list를 정렬된 상태로 바꿔줍니다.
numbers = [5, 3, 7, 1]
numbers.sort()
print(numbers)
[1, 3, 5, 7]
reverse 메소드
some_list.reverse()는 some_list의 원소들을 뒤집어진 순서로 배치합니다.
numbers = [5, 3, 7, 1]
numbers.reverse()
print(numbers)
[1, 7, 3, 5]
index 메소드
some_list.index(x)는 some_list에서 x의 값을 갖고 있는 원소의 인덱스를 리턴해줍니다.
members = ["영훈", "윤수", "태호", "혜린"]
print(members.index("윤수"))
print(members.index("태호"))
1
2
remove 메소드
some_list.remove(x)는 some_list에서 첫 번째로 x의 값을 갖고 있는 원소를 삭제해줍니다.
fruits = ["딸기", "당근", "파인애플", "수박", "참외", "메론"]
fruits.remove("파인애플")
print(fruits)
['딸기', '당근', '수박', '참외', '메론']
for 반복문
while과 for는 비슷하지만, 상황에 따라 for이 더 깔끔할 수 있다.
my_list = [2, 3, 5, 7, 11]
for number in my_list: # for은 while과 달리 조건부분이 존재하지 않음
print(number)
2
3
5
7
11
for은 수행 부분은 존재하지만 while과 달리 조건 부분이 존재하지 않는다.
참고로 number은 우리가 임의로 정한 값으로 아무렇게나 바꾸어도 상관없다.
위의 for문을 while문으로 바꾸면 다음과 같다. 이 경우에는 for문이 더 깔끔한 것을 알 수 있다.
my_list = [2, 3, 5, 7, 11]
i = 0
while i < len(my_list):
print(my_list[i])
i += 1
while문과 for문은 상황에 따라 판단 후 더 좋은 걸 골라 사용하길 바란다.
range 함수
for 반복문을 사용해서 1부터 10까지 출력하는 프로그램을 만들어 보자.
for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
print(i)
1
2
3
4
5
6
7
8
9
10
여기까지는 견딜만 한데 1부터 100까지 출력하는 프로그램을 만든다면? 너무나도 반복적이고 귀찮은 작업을 해야한다.
range 함수
- range( )
- range( , )
- range( , , )
# 파라미터 2개 버전
for i in range(start, stop): # start부터 stop - 1까지의 범위
print(i)
# ex)
for i in range(3, 11): # 3 ~ 10
print(i)
# 다음과 같다
for i in [3, 4, 5, 6, 7, 8, 9, 10]:
print(i)
# 파라미터 1개 버전
for i in range(stop): # 0부터 stop - 1까지의 범위
print(i)
# ex)
for i in range(10): # 0 ~ 9
print(i)
# 다음과 같다.
for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
print(i)
# 파라미터 3개 버전
for i in range(star, stop, step): # start부터 stop - 1까지의 범위, 간격 step
print(i)
# ex)
for i in range(3, 17, 3): # 3 ~ 16, 숫자들 간의 간격 3
print(i)
# 다음과 같다.
for i in [3, 6, 9, 12, 15]:
print(i)
range 함수 장점?
- 간편함
- 깔끔함
- 메모리 효율성
실습과제: range 연습
numbers라는 리스트가 주어졌습니다.
for문과 range 함수를 사용하여, numbers의 인덱스와 원소를 출력해 보세요.
numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
# 인덱스와 원소 출력
# 코드를 입력하세요.
실행하면 콘솔에 아래와 같이 출력됩니다.
0 2
1 3
2 5
3 7
4 11
5 13
6 17
7 19
8 23
9 29
10 31
나의 답안
numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
# 인덱스와 원소 출력
# 코드를 입력하세요.
for i in range(len(numbers)):
print(i, numbers[i])
모범 답안
numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
# 인덱스와 원소 출력
for i in range(len(numbers)):
print(i, numbers[i])
실습과제: 거듭제곱
"2의 n제곱"을 출력하는 프로그램을 만들려고 합니다.
코드를 실행하면 아래와 같이 2^0 = 1부터 2^10 = 1024까지 출력되어야 합니다.
2^0 = 1
2^1 = 2
2^2 = 4
.
.
.
2^10 = 1024
나의 답안
for i in range(11):
print("2^{} = {}".format(i, 2 ** i))
모범 답안
for i in range(11):
print("{}^{} = {}".format(2, i, 2 ** i))
실습과제: for문으로 구구단
구구단 프로그램을 while문이 아닌 for문을 사용해서 만들어 보세요.
코드를 실행하면, 아래와 같이 출력되어야 합니다.
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
.
.
.
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
나의 답안
for i in range(1, 10, 1):
for j in range(1, 10, 1):
print("{} * {} = {}".format(i, j, i * j))
모범 답안
for i in range(1, 10):
for j in range(1, 10):
print("{} * {} = {}".format(i, j, i * j))
실습과제: 피타고라스 삼조
'피타고라스 정리'라고 들어 보셨나요? 직각삼각형에서, 빗변의 제곱이 두 직각변의 제곱의 합과 같다는 정리입니다.
거기서 나온 '피타고라스 삼조'라는 개념이 있는데요. 피타고라스 삼조란, 피타고라스 정리(a^2 + b^2 = c^2 )를 만족하는 세 자연수 쌍 (a, b, c)입니다.
예를 들어, 3^2 + 4^2 = 5^2이기 때문에 (3, 4, 5)는 피타고라스 삼조입니다.
a < b < c라고 가정할 때, a+b+c=400을 만족하는 피타고라스 삼조 (a, b, c)는 단 하나인데요. 이 경우, a * b * c는 얼마인가요?
2040000
나의 답안 1
for a in range(1, 400):
for b in range(1, 400):
for c in range(1, 400):
if (a**2 + b**2 == c**2) and (a < b < c) and (a + b + c == 400):
print(a * b * c)
>>> 실행 오류
힌트
힌트 1
가장 단순하게 코드를 짜면 이렇습니다.
for a in range(1, 400):
for b in range(1, 400):
for c in range(1, 400):
if a * a + b * b == c * c and a < b < c and a + b + c == 400:
print(a * b * c)
이 코드를 막상 실행해 보면, 굉장히 오랜 시간이 걸릴 것입니다. 논리적으로 봤을 때는 정답을 찾아 주는 코드입니다. 하지만 너무 오래 걸려서 사실상 사용할 수 없다고 보시면 되는데요. 이런 걸 "비효율적인 알고리즘"이라고 합니다.
알고리즘이 비효율적인 이유를 간단히만 설명드리겠습니다.
a가 가능한 경우는 1부터 399까지, b가 가능한 경우는 1부터 399까지, c가 가능한 경우는 1부터 399까지인데요. 그러면,
if a * a + b * b == c * c and a < b < c and a + b + c == 400:
print(a * b * c)
위 코드가 총 63,521,199번 실행됩니다. 6천만 번 이상 실행되는 거죠.
더 효율적인 코드를 짜기 위해서 for문을 두 개만 쓰세요.
힌트 2
우리는 a+b+c=400이라는 조건을 지켜야 합니다. 그말인즉슨 c=400-a-b라는 거죠. 이 점을 잘 활용해 보세요.
나의 답안 2
for a in range(1, 400):
for b in range(1, 400):
if (a**2 + b**2 == (400 - a - b)**2) and (a < b < 400 - a - b) and (a + b + (400 - a - b) == 400) :
print(a * b * (400 - a - b))
모범 답안
for a in range(1, 400):
for b in range(1, 400):
c = 400 - a - b
if a * a + b * b == c * c and a < b < c:
print(a * b * c)
실습과제: 리스트 뒤집기
리스트 원소들의 순서를 거꾸로 뒤집으려고 합니다.
numbers라는 리스트가 주어졌을 때, for문을 사용하여 리스트를 거꾸로 뒤집어 보세요!
numbers = [2, 3, 5, 7, 11, 13, 17, 19]
# 리스트 뒤집기
# 코드를 입력하세요.
print("뒤집어진 리스트: " + str(numbers))
뒤집어진 리스트: [19, 17, 13, 11, 7, 5, 3, 2]
'~2023.02 > Python' 카테고리의 다른 글
프로그래밍 기초 in Python _ [토픽4] 파이썬 응용하기 _ 파이썬 모듈 맛보기 & 사용자 입력 받기 (0) | 2021.09.17 |
---|---|
프로그래밍 기초 in Python _ [토픽3] 프로그래밍과 데이터 in Python _ 사전 & 파이썬 데이터의 비밀 (0) | 2021.09.05 |
프로그래밍 기초 in Python _ [토픽2] 프로그래밍 핵심 개념 in Python _ 제어문 (0) | 2021.09.03 |
프로그래밍 기초 in Python _ [토픽2] 프로그래밍 핵심 개념 in Python _ 추상화 (0) | 2021.09.03 |
프로그래밍 기초 in Python _ [토픽2] 프로그래밍 핵심 개념 in Python _ 자료형 (0) | 2021.09.03 |