>> positives([-2, 0, 3, 7, -1]) [3, 7] """ # 2 def char_counts(s: str) -> dict[str, int]: """ >>> char_counts("banana") {'b': 1, 'a': 3, 'n': 2} """ # 3 def top2(s: str) -> list[str]: """가장 많이 나온 문자 2개를, 많은 순서로. >>> top2("banana") ['a', 'n'] """ # 4 def group_by_initial(words: list[str]) -> dict[str, list[str]]: """첫 글자로 묶기. >>> group_by_initial(["apple", "avocado", "banana", "cherry"]) {'a': ['apple', 'avocado'], 'b': ['banana'], 'c': ['cherry']} """ # 5 def drain_front(xs: list[int]) -> tuple[int, list[int]]: """xs로 큐를 만들어 앞에서 하나 뺀다. (뺀 값, 남은 것들) >>> drain_front([10, 20, 30]) (10, [20, 30]) """"> >> positives([-2, 0, 3, 7, -1]) [3, 7] """ # 2 def char_counts(s: str) -> dict[str, int]: """ >>> char_counts("banana") {'b': 1, 'a': 3, 'n': 2} """ # 3 def top2(s: str) -> list[str]: """가장 많이 나온 문자 2개를, 많은 순서로. >>> top2("banana") ['a', 'n'] """ # 4 def group_by_initial(words: list[str]) -> dict[str, list[str]]: """첫 글자로 묶기. >>> group_by_initial(["apple", "avocado", "banana", "cherry"]) {'a': ['apple', 'avocado'], 'b': ['banana'], 'c': ['cherry']} """ # 5 def drain_front(xs: list[int]) -> tuple[int, list[int]]: """xs로 큐를 만들어 앞에서 하나 뺀다. (뺀 값, 남은 것들) >>> drain_front([10, 20, 30]) (10, [20, 30]) """"> >> positives([-2, 0, 3, 7, -1]) [3, 7] """ # 2 def char_counts(s: str) -> dict[str, int]: """ >>> char_counts("banana") {'b': 1, 'a': 3, 'n': 2} """ # 3 def top2(s: str) -> list[str]: """가장 많이 나온 문자 2개를, 많은 순서로. >>> top2("banana") ['a', 'n'] """ # 4 def group_by_initial(words: list[str]) -> dict[str, list[str]]: """첫 글자로 묶기. >>> group_by_initial(["apple", "avocado", "banana", "cherry"]) {'a': ['apple', 'avocado'], 'b': ['banana'], 'c': ['cherry']} """ # 5 def drain_front(xs: list[int]) -> tuple[int, list[int]]: """xs로 큐를 만들어 앞에서 하나 뺀다. (뺀 값, 남은 것들) >>> drain_front([10, 20, 30]) (10, [20, 30]) """">
from collections import ...   # 필요한 것만 채워

# 1
def positives(xs: list[int]) -> list[int]:
    """
    >>> positives([-2, 0, 3, 7, -1])
    [3, 7]
    """

# 2
def char_counts(s: str) -> dict[str, int]:
    """
    >>> char_counts("banana")
    {'b': 1, 'a': 3, 'n': 2}
    """

# 3
def top2(s: str) -> list[str]:
    """가장 많이 나온 문자 2개를, 많은 순서로.
    >>> top2("banana")
    ['a', 'n']
    """

# 4
def group_by_initial(words: list[str]) -> dict[str, list[str]]:
    """첫 글자로 묶기.
    >>> group_by_initial(["apple", "avocado", "banana", "cherry"])
    {'a': ['apple', 'avocado'], 'b': ['banana'], 'c': ['cherry']}
    """

# 5
def drain_front(xs: list[int]) -> tuple[int, list[int]]:
    """xs로 큐를 만들어 앞에서 하나 뺀다. (뺀 값, 남은 것들)
    >>> drain_front([10, 20, 30])
    (10, [20, 30])
    """

Answers

# 1 리스트 xs 에서 0보다 큰 것만 골라 새 리스트
def positives(xs: list[int]) -> list[int]:
    '''
    >>> positives([-2, 0, 3, 7, -1])
    [3, 7]
    '''
    return [x for x in xs if x > 0]

Python List Comprehension 사용.

#2 문자열 s 에서 각 문자의 등장 횟수 세기
def char_counts(s: str) -> dict[str, int]:
    '''
    >>> char_counts("banana")
    {'b': 1, 'a': 3, 'n': 2}
    '''
    my_dict = {}
    for i in s:
        if i in my_dict:
            my_dict[i] += 1
        else:
            my_dict[i] = 1
            
    return my_dict

#2 dict.get() 사용
def char_counts(s: str) -> dict[str, int]:
		'''
    >>> char_counts("banana")
    {'b': 1, 'a': 3, 'n': 2}
    '''
    d = {}
    for i in s:
        d[i] = d.get(i, 0) + 1
    return d

dict는 set의 역할도 한다. 둘 다 해시테이블을 사용한다. 해시맵이냐 해시셋이냐의 차이일 뿐이다. 그래서 if i in my_dict를 쓰면 된다.

d.get(i, 0)은 i가 해시테이블에 있으면 그 value를 가져오고, 없으면 0을 반환한다. 이런 상황에서 정말 유용하게 쓰인다.