21.2.18~19
<파이썬 어려웠던 개념 정리 : for ~ 복잡한 함수 인자(43~52)>
- for문 기초
- 문제 : unique value 빼고 나머지는 삭제 후 프린트
- 접근 :
먼저 sorted로 정렬 후 옆 인덱스 요소와 같은지 비교 후 새로운 리스트 짜기 : 실패.
my_list = [1, 2, 3, 4, 5, 1, 2, 3, 7, 9, 9, 7]
my_list = sorted(my_list)
new_list = []
for i in range(11):
if my_list[i] != my_list[i+1]:
new_list.append(my_list[i])
print(new_list)
한참 생각하다가 결정한 것 : count속성. 말 그대로 갯수를 세어 주면 되는 것 아니겠나.
my_list = [1, 2, 3, 4, 5, 1, 2, 3, 7, 9, 9, 7]
for i in my_list:
if my_list.count(i) == 1:
print(i)
성공.
- range
- 문제 : 어렵지 않았으나 오류 발생
"IndentationError: unindent does not match any outer indentation level"
아마 레플잇 문제인 거 같다. 많이 들여쓰니 잘 되었다.
- 45번 푸는 도중 헷갈렸던 것 :
range(1, 10, 2) -> 10과 2 자리 헷갈려서 계속 틀렸다. 조심하자. - 항상 (시작, 끝, 간격) 지키기.
(참고) replit 중 나오는 에러 :
IndentationError: unindent does not match any outer indentation level
들여쓰기 문제인데 탭이나 스페이스를 섞어 쓰면 나온다고 한다.
- 문제 : 리스트 요소의 합을 for loop으로 구하기
- 고민 : 문제 자체를 이해 못했었음. 그러다 sum을 활용하려 했으나 for 에서는 sum이 안 되었음.
- 방식을 구했으나 my_list[i]라고 두어 이미 꺼내진 i를 무시함. 그래서 결과가 안 나왔음.
- 해결 : total = 0으로 놓고 하나씩 요소를 꺼내서 더하는 방식 사용
def list_loop() :
# 아래의 코드를 수정하지 마세요.
my_list = [ 2, 3, 4, 5, 6]
# 아래에 코드를 작성해 주세요.
total = 0
for i in my_list:
total += i
print(total)
# 아래의 코드를 수정하지 마세요.
return total
- while
- 처음 안 것 : while ~ else. 즉 while 문이 종료되면 else가 실행된다.
while <조건문>:
<수행할 문장1>
<수행할 문장2>
<수행할 문장3>
...
<수행할 문장N>
else:
<while문이 종료된 후 수행할 문장1>
<while문이 종료된 후 수행할 문장2>
<while문이 종료된 후 수행할 문장3>
...
<while문이 종료된 후 수행할 문장N>
- 문제 : while 이용한 최소 약수 출력.
- 고민 : 일단 약수들의 모임을 어떻게 구할 것인가 고민.
- 해결 : 먼저 1이 아니라고 했으니 for문으로 1 이상부터 시작(2) 이후 소수(prime number)일 수 있으니 자기 자신 포함하여 range돌림.
이를 통해 나머지가 0이 되는 순간 while 문이 break될 수 있도록 코드 작성.(for, while, break 동시 활용)
def find_smallest_integer_divisor(numb):
## 아래 코드를 입력해주세요.
while numb > 0:
for i in range(2, numb+1):
if numb % i == 0:
break
return i
- dict와 for 반복문
- 문제 : 리스트 값의 요소와 요소 갯수를 dict으로 표현할 것.
- 고민한 것 :
첫 고민 : 요소의 갯수는 count를 써서 따로 리스트를 만든 뒤 두 리스트를 딕셔너리로 만들기. -> 모든 요소를 분해해서 두 리스트를 만들어야 하므로 포기. 너무 복잡해짐.
두 번째 고민 : 모듈 사용
from collections import Counter
def get_occurrence_count(my_list):
# 이 함수를 구현 해주세요
ret = Counter(my_list)
for key in ret:
return key, ret[key]
결과 : 튜플로 한 값만 나온다. 실패.
세 번째 고민 : 아직 배우진 않았지만 구글링 통해 예외처리로 하는 법을 알아냈다.
def get_occurrence_count(my_list):
count = {}
for i in my_list:
try: count[i] += 1
except : count[i] = 1
return count
try : 값이 없으면 1을 더해라
except : 있으면 1이다.
이건 아직까진 마법. 추후 예외처리 공부 후 다시 생각해보기.
- 딕셔너리 중첩 : 딕셔너리 안에 딕셔너리를 넣는 것이 가장 효율적.
- 문제 : 팀 명을 넣었을 때 정보 나오게 하기
- 고민해본 것 :
실패 : 리턴 값을 조정해본다. (by 코딩도장)
실패 : 직접 해쉬들을 넣어본다.
실패 : for 문을 돌려본다.
여기서 문제점 : team_name을 리턴하면 그냥 말 그대로 팀 네임이 나오지 그에 해당하는 값이 전혀 나오지 않는다. 이를 해결하기 위해서는 일단 팀네임을 리턴했을 때 딸려 나오는 값이 있게 함수를 구현해야 한다. 여기까지는 이해 했다.
두 번째. 그리고 문제에 자료가 없다.
- 성공 : 직접 중첩 딕셔너리를 구축해서 코드를 짠다.
- 힌트 : https://dojang.io/mod/page/view.php?id=2310
- kwargs vs args
- 인자의 갯수가 정해지지 않았을 때 사용하는 것으로 키워드면 kwargs, 아니면 args
- 문제 : kwargs, args를 이용한 함수 구현
- 고민 : for 문으로 반복해서 돌려봄, 결과는 실패. 원하는 글자 두 글자가 모두 뽑혀 나와야 하는데 요소가 하나만 나와서 계산이 안 됨.
다음 고민 :
def what_is_my_full_name(**kwargs):
if "정" in kwargs and "우성" in kwargs:
return "정 우성"
if "정" in kwargs and "우성" not in kwargs:
return "정"
if "정" not in kwargs and "우성" in kwargs:
return "우성"
if "정" not in kwargs and "우성" not in kwargs:
return "Nobody"
일일이 대조해가며 if문을 돌려봤으나 nobody 값을 거르지 못해 실패.
(결국 동기분 질문으로 해결)
def what_is_my_full_name(**kwargs):
full_name = kwargs
first_name = full_name.get("first_name", "")
last_name = full_name.get("last_name", "")
if not first_name and not last_name:
return "Nobody"
if first_name and not last_name:
return first_name
if not first_name and last_name:
return last_name
else:
return last_name + " " + first_name
여기서 배운 2가지
- kwargs로 언패킹 시 {"" : ""} 형태로 풀린다. 고로 kwargs를 return하면 딕셔너리가 나온다. -> 여기서 일단 first_name, last_name해결
- 딕셔너리 속성 중 get 이용 방법 : 언패킹 한 키, 값에서 값을 가져오기 위해 속성 사용.
x = dictionary.get("key", ""); 값이 없으면 공백
- if not : ~이 아니라면 ~다. 조금 더 파이썬스러운 코드. != 이런것 보다 더 잘 써야겠다.
참고 : https://wikidocs.net/16#key-valueget
Author And Source
이 문제에 관하여(21.2.18~19), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sinichy7/21.2.1819저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)