[Pre-course] 2021. 10. 11

11912 단어 pythonTILTIL

Python

Pre-course 문제와 함께하는 헛갈리는 개념 바로잡기


1. Looping Dictionary

Input으로 주어진 list의 각 요소(element)가 해당 list에 몇번 나타나는지 수를 dictionary로 만들어서 return해주세요. Dictionary의 key는 list의 요소 값이며 value는 해당 요소의 총 빈도수 입니다.

예를 들어, 다음과 같은 list가 input으로 주어졌다면:

my_list = ["one", 2, 3, 2, "one"]

다음과 같은 dictionary가 return 되어야 합니다.

{
   "one" : 2,
    2 : 2,
    3: 1
}

문제 해결 순서를 생각해보자면

  1. my_list의 중복값을 제거한다
  2. 고유값을 dictionarykey값에 넣는다
  3. key값이 my_list에서 중복되는 횟수를 'value'값에 넣는다
def get_occurrence_count(my_list):
  my_dict = {}
  unique_list = list(set(my_list))
# 함수를 선언한 후 return 될 빈 dictionary를 먼저 생성했다
# list(set(my_list))를 통해 중복값이 제거된 list를 생성했다
  for i in unique_list:
    my_dict[i] = my_list.count(i)
  return my_dict
# for문을 통해 고유값을 key(my_dict[i])값에, 빈도수를 value(my_list.count(i))값에 넣었다
print(get_occurrence_count(my_list))
# {2: 2, 3: 1, 'one': 2} 출력이 잘 되는 것을 확인할 수 있다

해당 풀이에서 아쉬운 점은 set을 이용해서 그런지 순서가 변경되었다는 점이다
그렇다면 list의 순서를 건드리지 않는 중복값 제거방법은 또 뭐가 있을까?

검색을 하다가 for문을 이용한 방법과 dictionary를 이용한 방법을 찾게 되었다

  1. for문 이용
result = []
for value in arr:
    if value not in result:
        result.append(value)
  1. dictionary 이용
result1 = dict.fromkeys(arr)
result2 = list(result1)

*dict.fromkeys(iterable): 인자로 들어온 iterable 데이터를 key 값으로 해서 딕셔너리 자료형을 만들어 주는 작업을 하는 메서드

1번은 이전에 몇 번 써봤으니 2번을 이용해서 다시 풀어보자

def get_occurrence_count(my_list):
  my_dict = dict.fromkeys(my_list)
# dict.fromkeys(my_list)를 통해 중복값이 제거된 dictionary를 생성했다
  for i in my_dict:
    my_dict[i] = my_list.count(i)
  return my_dict
# for문을 통해 my_dict 각각의 key값에 해당하는 value값에 빈도수(my_list.count(i))를 넣었다
print(get_occurrence_count(my_list))
# {'one': 2, 2: 2, 3: 1} 출력이 잘 되는 것을 확인할 수 있다

2. More Complex Function Parameters

what_is_my_full_name 함수는 주어진 parameter중 first_name 과 last_name 이라는 parameter를 조합하여 full name을 return 해주어야 합니다.

예를 들어, first_name이 "우성" 이고 last_name 이 "정" 이면 "정 우성" 라고 return 하면 됩니다.

Last name과 first name 사이에 space(빈칸)이 들어가 있어야 합니다.

만일 last_name이 없거나 first_name이 없으면 둘 중하나만 return 하면 됩니다.

예를 들어, last_name이 없으면 "우성" 이라고 이름만 return 하면 됩니다,

마지막으로, last_name과 first_name 둘다 없으면 "Nobody" 라고 return 하면 됩니다.

해당 문제는 **kwargs를 사용하여 keyvalue 값을 조건에 맞게 return하면 된다

def what_is_my_full_name(**kwargs):
    for name in kwargs:
# 함수를 선언하고 for문을 통해 이름을 return한다
      if ("first_name" in kwargs) and ("last_name" in kwargs):
        return f'{kwargs["last_name"]} {kwargs["first_name"]}'
# first_name과 last_name이 둘 다 존재할 때
      elif ("first_name" in kwargs) and ("last_name" not in kwargs):
        return f'{kwargs["first_name"]}'
# first_name만 존재할 때
      elif ("first_name" not in kwargs) and ("last_name" in kwargs):
        return f'{kwargs["last_name"]}'
# last_name만 존재할 때
    return "Nobody"
# if문에서 return할 값이 없을 때
print(what_is_my_full_name(first_name = "우성", last_name = "정"))
# 정 우성

이 문제는 한 번에 풀지 못하고 검색과 질문을 통해 해결했는데.. 슬픈 일이 하나 있었다

검색을 통해 해답을 찾았을 때 if문의 return 값이 return f"""{kwargs["last_name"]} {kwargs["first_name"]}""" 였다

구조는 이해를 했는데 왜 """를 사용했는지 도저히 이해가 되지 않아서 다른 분에게 질문을 했더니 "last_name""first_name"에서 "가 이미 사용되서 ' 또는 """를 사용해야 되는 걸 알게되었다..

정말 기초적인 지식인데 바보 같이 붙잡고 고민하고 있던건지..

더 열심히 하자 😥

좋은 웹페이지 즐겨찾기