21.2.18~19

<파이썬 어려웠던 개념 정리 : for ~ 복잡한 함수 인자(43~52)>

  1. 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)

성공.

  1. 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
들여쓰기 문제인데 탭이나 스페이스를 섞어 쓰면 나온다고 한다.

  1. 문제 : 리스트 요소의 합을 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
  1. 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
  1. 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이다.

이건 아직까진 마법. 추후 예외처리 공부 후 다시 생각해보기.

  1. 딕셔너리 중첩 : 딕셔너리 안에 딕셔너리를 넣는 것이 가장 효율적.
  • 문제 : 팀 명을 넣었을 때 정보 나오게 하기
  • 고민해본 것 :
    실패 : 리턴 값을 조정해본다. (by 코딩도장)
    실패 : 직접 해쉬들을 넣어본다.
    실패 : for 문을 돌려본다.

여기서 문제점 : team_name을 리턴하면 그냥 말 그대로 팀 네임이 나오지 그에 해당하는 값이 전혀 나오지 않는다. 이를 해결하기 위해서는 일단 팀네임을 리턴했을 때 딸려 나오는 값이 있게 함수를 구현해야 한다. 여기까지는 이해 했다.
두 번째. 그리고 문제에 자료가 없다.

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

좋은 웹페이지 즐겨찾기