| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- 상속
- OOP
- OpenCV
- 제네릭프로그래밍
- 11382번
- 프로그래머스lv2
- 동적바인딩
- 스택
- 포인터
- 기본클래스
- c++코딩테스트합격자되기
- 유도클래스
- STL
- 깊은복사
- 얕은복사
- 데이터사이언스
- C++
- 다형성
- 멤버함수로구현
- 주피터
- 인프런
- 백준
- 코드잇
- 참조자
- 코딩테스트
- list comprehension
- 람다식
- 연산자오버로딩
- 점프투파이썬
- python
- Today
- Total
WjExplor Story
2025.09.26(화) - 1주 2일차 강의 복습 (1) - 파이썬 기초 문법 문제 풀이 본문
2025.09.26(화) - 1주 2일차 강의 복습 (1) - 파이썬 기초 문법 문제 풀이
더블유제이플로어 2025. 9. 26. 09:35파이썬 기초 문법 문제 풀이 진행
문제 11. 딕셔너리 반복문
다음 딕셔너리를 이용해 "이름: 점수" 형식으로 출력하세요.
scores = {"Kim": 90, "Lee": 85, "Park": 95}
print(scores.items()) # dict_items([('Kim', 90), ('Lee', 85), ('Park', 95)])
scores.items()를 실행하면
각 실행의 쌍이 실행된다.
for 문으로 변수자리에 한 개밖에 없었는데 두 개를 넣으려면
key는 name 자리, values 자리는 score 자리라서 반복문에서 쌍으로 실행된다.
for name in scores.items():
print(f'{name}')
print("====")
print(name [0])
print(name [1])
/*
('Kim', 90)
('Lee', 85)
('Park', 95)
====
Park
95
*/
. items()으로 for 문에 변수 1개만 넣으면
키랑 벨류를 한 개 한 개씩 넣어야 한다.
불편하다.
** 딕셔너리는 쌍으로 이루어진 값이다**
반복문을 순회하려면 .items() 을 하면 쉽다.
scores = {"Kim": 90, "Lee": 85, "Park": 95}
for name,score in scores.items():
print(f'{name} : {score}')
문제 10. 람다 함수
리스트 [1, 2, 3, 4, 5]에서 각 원소를 제곱한 새로운 리스트를 map과 lambda를 사용하여 만드세요.
map -> 리스트에 함수 적용
map(lambda x : x+1 , my_list)
map 함수 적용시 list로 형 변환 해줘야 한다
# 왜 map 함수를 list로 형 변환해야 하는가?
Python 3에서 `map` 함수는 리스트를 직접 반환하지 않고 'map 객체'를 반환합니다. 이 객체는 '이터레이터(iterator)'의 한 종류입니다.
이터레이터는 모든 값을 한 번에 계산하여 메모리에 저장하는 대신, 값이 필요할 때마다 하나씩 실시간으로 생성해 내는 객체입니다.
- **메모리 효율성:** 대용량 데이터를 처리할 때, 모든 결과를 미리 리스트로 만들어 저장하면 메모리 소모가 큽니다. 이터레이터는 값을 하나씩 처리하므로 메모리를 매우 효율적으로 사용할 수 있습니다.
- **지연 평가(Lazy Evaluation):** 실제로 값이 필요하기 전까지는 계산을 미루기 때문에, 모든 값을 사용하지 않는 경우 불필요한 계산을 피할 수 있습니다.
따라서 `list(map_object)`와 같이 형 변환을 하는 이유는, 이터레이터가 만들어내는 모든 값들을 실제로 계산하여 우리가 눈으로 보고 다룰 수 있는 '리스트' 형태로 만들기 위함입니다. 리스트로 변환해야만 인덱스 접근, 슬라이싱 등 리스트의 다양한 기능을 사용할 수 있습니다.
map_object = map(lambda x : x**2 , numbers)
squared_numbers = list(map_object)
print(squared_numbers)
검색 능력도 중요하다.
구글 검색창에서
'파이썬 map'
검색하고 예시 따라 하면 쉬운 개념은 따라하면 금방 알아낸다.
어려운 개념은 안 나올 때 영어로 검색하면 좋다
'python list map'
그리고 내용들을 봐서 해결하면 좋다.
지금은 대중결과가 쉬워서 검색결과가 나오지만
마이너적인 내용의 검색결과는 나중에 설명하도록 하자.
문제 12. 리스트와 조건문
다음 리스트에서 양수만 새로운 리스트로 담으세요.
여러 가지 방법이 있다
필터 기능도 있고
for문 기능으로도 할 수 있다.
안 배운 문법으로 정답이 나와서 문법 설명 하겠다.
new_list = []
nums = [-5, 3, 0, -2, 7, 8, -1]
for i in nums:
if i > 0:
new_list.append(i)
정석적인 방법이고
리스트 컴프리헨션 문법
반복문을 한줄로 표현하는 문법
조건문을 한줄로 표현하는 건 어제 배움
리스트로 시작한다.
[ i for i in range(10) ]
이러면 0~9까지 있는 리스트가 생긴다.
여기서 조건을 쓰고 싶다면
[ i for i in range(10) if 조건문 ]
짝수만 받고 싶다면
[i for i in range(100) if i%20 == 0]
실무에서 많이 쓰는 문법이니깐
이걸 이해하면 읽기도 쓰기도 쉬우니 종종 연습할 것
리스트 컴프리헨션으로 이중포문
[i for i in range(10) if (i> 5) and (i %2 ==0) and i>7] #[8]
리스트 컴프리헨션 두개를 이용하여 사용할 수 있다.
앞에 i 자리에 i 를 활용한 리스트를 작성하면 된다.
[[k for k in range(i)] for i in range(10)]
[[],
[0],
[0, 1],
[0, 1, 2],
[0, 1, 2, 3],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5, 6],
[0, 1, 2, 3, 4, 5, 6, 7],
[0, 1, 2, 3, 4, 5, 6, 7, 8]]
있긴한대 자주 사용은 하지는 않는다.
i 자리에 활용을 하는게 좋으니
i 안에 활용하는 걸 사용해서 사용한다.
Q. i 자리에 어떤걸 넣어야 하는지 더 자세히 알려줘
### 답변: 리스트 컴프리헨션의 첫 번째 항목(표현식) 상세 설명
리스트 컴프리헨션 `[표현식 for 항목 in 반복가능객체]`에서 맨 앞의 `표현식` 부분은 최종적으로 리스트에 담길 '결과값'의 형태를 결정하다.
`for` 루프에서 가져온 `항목` 변수를 재료로 사용하여, 원하는 어떤 형태로든 가공하는 것이 가능.
1. **항목 그대로 사용**
- `[i for i in range(5)]` -> `[0, 1, 2, 3, 4]`
- `for` 루프의 변수 `i`를 아무런 가공 없이 그대로 리스트에 담다.
2. **항목을 연산하여 사용**
- `[i * 2 for i in range(5)]` -> `[0, 2, 4, 6, 8]`
- 변수 `i`에 2를 곱한 결과를 리스트에 담다.
3. **다른 함수를 적용하여 사용**
- `[str(i) for i in range(5)]` -> `['0', '1', '2', '3', '4']`
- 변수 `i`를 `str()` 함수를 이용해 문자열로 변환한 결과를 담다.
4. **다른 리스트 컴프리헨션을 사용 (중첩)**
- `[[k for k in range(i)] for i in range(5)]` -> `[[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3]]`
- 바깥 `for` 루프의 변수 `i`를 안쪽 리스트 컴프리헨션의 `range(i)`에 사용하다.
- 즉, `i`가 0일 때는 `[k for k in range(0)]` -> `[]`가, `i`가 1일 때는 `[k for k in range(1)]` -> `[0]`가 리스트의 요소가 됨.
**결론적으로, 첫 번째 `i` 자리(표현식)에는 `for` 루프에서 받은 변수를 활용한 최종 결과물의 형태라면 무엇이든 작성 가능.**
### 문제 10. 함수와 기본값
함수를 작성하세요.
이름: greet
매개변수: name, msg="안녕하세요"
출력: "안녕하세요, name!"
def greet(name, msg="안녕하세요"):
print(f"{msg}, {name}!")
greet("철수")
greet("영희", "반가워요")
---
유저가 msg를 직접 입력하면 직접 입력한걸 보여주고
아니면 기본값을 설정해서 추후에 유저가 많은 매개변수 중에서 작성하지 않은건 함수에서 기본값으로 설정해주어서 입력하지 않으면 기본값을 표현해준다.
---
def greet(name, msg='안녕하세요'):
print(f'{msg}, {name}!')
greet('철수')
greet('지은', '반갑습니다')
### 문제 12. 조건문과 리스트
사용자로부터 점수(0~100)를 입력받아
90 이상: "A"
80 이상: "B"
70 이상: "C"
그 외: "F"
를 출력하는 프로그램을 작성하세요.
---
입력받아 -> input으로 한다.
score = int(input())
코딩테스트할때도 자주 사용하니 형식을 외워둬도 좋다.
### 문제 13. 리스트 중첩
다음 2차원 리스트에서 모든 원소를 하나의 리스트로 합치세요.
matrix = [[1, 2], [3, 4], [5, 6]]
---
matrix = [[1, 2], [3, 4], [5, 6]]
matrix_list = [item for sublist in matrix for item in sublist]
print(matrix_list)
```
여러가지 해당이 될텐데
리스트 컴프리헨션도 되고 만일 다르게 한다면
# 강사님 코드
# 리스트 컴프리헨션 말고 사용하기
```
matrix = [[1, 2], [3, 4], [5, 6]]
my_list = []
for li in matrix:
for i in li:
my_list.append(i)
print(my_list)
### 문제 14. 딕셔너리 생성
리스트 두 개를 이용하여 딕셔너리를 만드세요.
keys = ["name", "age", "city"]
values = ["Tom", 20, "Seoul"]
person = dict(zip(keys, values))
print(person)
---
zip() 은 묶어주는것이다.
zip() 으로쓰면 ?? 가 나온다
그래서 list 로 형변환해줘야한다.
zip() 은 마이너한 내용이기 때문에 이론에서 따로 배우진 않고 문제를 통해서 배움.
---
### zip() 함수와 list 형 변환
`zip()` 함수는 `map()`처럼 결과를 리스트로 즉시 반환하지 않고, 'zip 객체'라는 이터레이터(iterator)를 반환하다.
이터레이터는 모든 값을 메모리에 한 번에 저장하는 대신, 값이 필요할 때마다 실시간으로 짝(tuple)을 하나씩 생성하는 방식으로 동작함.
**주요 장점:**
1. **메모리 효율성**: 대용량 데이터를 `zip`으로 묶을 때, 모든 짝을 담은 새 리스트를 미리 만들지 않아 메모리 낭비를 막는 것이 가능.
2. **처리 속도**: 반복문에서 모든 짝을 사용하지 않을 경우, 필요한 만큼만 연산하여 불필요한 계산을 피할 수 있다.
**결론:**
- `zip()`이 생성하는 모든 짝을 한 번에 보거나 리스트처럼 다루기 위해 `list()`로 형 변환이 필요하다.
- 형 변환을 통해 이터레이터의 모든 내용이 실제 리스트로 생성됨.
---
### 문제 15. 람다와 정렬
다음 리스트를 문자열 길이에 따라 정렬하세요.
```python
words = ["apple", "kiwi", "banana", "cherry"]
```
<details> <summary> 정답 </summary>
```python
words.sort(key=lambda x: len(x))
print(words)
```
---
정렬할때는 sort() 정렬이 사전순이나 값 순인데
key 에 람다 함수 형식으로 정렬 기준을 주면 좋다.
그러면 정렬이 원하는 방식으로 한다.
마이너한 내용이지만 참고 삼아 보면 좋은 내용이다.
정리
### 1. 딕셔너리(Dictionary) 다루기
# 핵심: 딕셔너리는 key-value 쌍으로 이루어져 있으며, .items()를 사용하면 반복문에서 키와 값을 동시에 효율적으로 다룰 수 있다.
# 문제: 다음 딕셔너리를 이용해 "이름: 점수" 형식으로 출력하세요.
scores = {"Kim": 90, "Lee": 85, "Park": 95}
# 해결: for문에서 name, score 변수로 .items()가 반환하는 키와 값을 각각 받는다.
for name, score in scores.items():
print(f'{name}: {score}')
# 보충: .keys()는 키만, .values()는 값만 순회할 때 사용 가능
# for key in scores.keys(): print(key)
# for value in scores.values(): print(value)
---
### 2. 리스트 컴프리헨션(List Comprehension)
# 핵심: 반복문(for)과 조건문(if)을 한 줄로 압축하여 간결하고 가독성 높은 리스트를 생성하는 문법이다.
# 형식: [표현식 for 항목 in 반복가능객체 if 조건문]
# 문제 1: 리스트에서 양수만 필터링하여 새 리스트를 만드세요.
nums = [-5, 3, 0, -2, 7, 8, -1]
# 해결: 리스트의 각 원소(i)가 0보다 클 경우에만 리스트에 포함시킨다.
positive_nums = [i for i in nums if i > 0]
print(positive_nums) # [3, 7, 8]
# 문제 2: 2차원 리스트를 1차원 리스트로 만드세요.
matrix = [[1, 2], [3, 4], [5, 6]]
# 해결: 이중 for문을 사용하여 바깥 리스트(sublist)와 내부 리스트(item)를 순차적으로 순회한다.
flattened_list = [item for sublist in matrix for item in sublist]
print(flattened_list) # [1, 2, 3, 4, 5, 6]
# 보충: 리스트 컴프리헨션이 너무 복잡해지면 오히려 가독성을 해칠 수 있다. 그럴 때는 일반 for문을 사용하는 것이 더 좋다.
---
### 3. 함수(Function) 정의와 활용
# 핵심: 함수는 코드의 재사용성을 높이며, 매개변수에 기본값을 설정하여 호출을 유연하게 만들 수 있다.
# 문제: 이름(name)과 메시지(msg)를 받아 인사말을 출력하는 함수를 만드세요. (msg의 기본값은 "안녕하세요")
def greet(name, msg="안녕하세요"):
print(f"{msg}, {name}!")
# 해결: msg 값을 주면 해당 값으로, 주지 않으면 기본값으로 동작한다.
greet("철수") # 안녕하세요, 철수!
greet("영희", "반가워요") # 반가워요, 영희!
# 보충: return과 print의 차이
# - print: 단순히 화면에 값을 '보여줄' 뿐, 함수 자체의 결과값은 None이다.
# - return: 함수가 특정 값을 '반환'하도록 하여, 그 결과를 다른 변수에 저장하거나 연산에 사용할 수 있게 한다.
---
### 4. 람다(lambda)와 고차 함수(map, sort)
# 핵심: 람다는 이름 없는 한 줄 함수를 정의하는 문법으로, map이나 sort처럼 다른 함수의 인자로 전달되어 특정 연산이나 정렬 기준을 적용할 때 유용하다.
# 문제 1: map을 사용하여 리스트의 모든 원소를 제곱하세요.
numbers = [1, 2, 3, 4, 5]
# 해결: map 함수에 각 원소(x)를 제곱하는 람다 함수를 적용한다.
squared_numbers = list(map(lambda x: x**2, numbers))
print(squared_numbers) # [1, 4, 9, 16, 25]
# 문제 2: 리스트를 문자열 길이에 따라 정렬하세요.
words = ["apple", "kiwi", "banana", "cherry"]
# 해결: sort의 key 인자에 문자열 길이를 반환하는 람다 함수를 전달하여 정렬 기준으로 삼는다.
words.sort(key=lambda x: len(x))
print(words) # ['kiwi', 'apple', 'banana', 'cherry']
# 보충: list.sort() vs sorted()
# - words.sort(): 원본 리스트 자체를 '그 자리에서' 정렬한다. (반환값 없음)
# - sorted(words): 정렬된 '새로운' 리스트를 반환한다. (원본 리스트는 그대로 유지)
---
### 5. 이터레이터(Iterator)와 zip() 함수
# 핵심: map, zip 등은 메모리 효율적인 이터레이터를 반환하므로, 모든 결과를 한 번에 보려면 list()나 dict() 등으로 형 변환이 필요하다.
# 문제: 두 리스트를 묶어 딕셔너리를 만드세요.
keys = ["name", "age", "city"]
values = ["Tom", 20, "Seoul"]
# 해결: zip으로 키와 값을 짝지어준 뒤, dict()로 감싸 딕셔너리로 변환한다.
person = dict(zip(keys, values))
print(person) # {'name': 'Tom', 'age': 20, 'city': 'Seoul'}
# 보충: zip()은 묶는 리스트들의 길이가 다를 경우, 가장 짧은 리스트의 길이를 기준으로 동작한다.
'AI 엔지니어 부트캠프 > 파이썬 데이터 분석 기초와 머신 러닝 기초' 카테고리의 다른 글
| 2025.09.26(화) - 1주 2일차 강의 복습 (3) - 객체와 클래스 (0) | 2025.09.26 |
|---|---|
| 단어장 만들기 (0) | 2025.09.26 |
| 숫자 맞히기 게임 (0) | 2025.09.26 |
| 2025.09.26(화) - 1주 2일차 강의 복습 (2) - 파이썬 응용 (0) | 2025.09.26 |
| 2025.09.25(화) - 1주차 1일차 강의 복습 (0) | 2025.09.25 |