ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬을 파이썬답게_2
    Python 2019. 11. 22. 10:06

     

     

    이전글 보러가기

    2019/09/30 - [Python] - 파이썬을 파이썬답게_1

     

    파이썬을 파이썬답게_1

    프로그래머스의 파이썬을 파이썬답게 라는 강의를 보고 정리한 글이다. 몪과 나머지 - divmod 두개의 수가 주어지고 몫과 나머지를 구해야 할때가 있다. ex) 7을 3으로 나눈 몫과 나머지 구하기 일반적으로 a = 7..

    dev-lagom.tistory.com

     

     

     

    프로그래머스의 파이썬을 파이썬답게 라는 강의를 보고 정리한 글이다.

     

     

    원본을 유지한채 정렬된 리스트 구하기 - sorted

    파이썬의 sort()함수를 사용하면 리스트의 원소를 정렬할 수 있다.

    sort함수는 원본의 순서를 변경 시킨다.

     

    • deep copy와 sort 함수 이용
    list1 = [4, 3, 2, 1]
    list2 = [i for i in list1] # 또는 copy.deepcopy를 사용
    list2.sort()

     

    • sorted 함수를 이용
    >>> list1
    [3, 2, 1]
    >>> list2 = sorted(list1)
    >>> list2
    [1, 2, 3]
    >>> list1
    [3, 2, 1]

     

    2차원 리스트 뒤집기

    • 입력
    [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

     

    • 출력
    [[1, 4, 7], [2, 5, 8], [3, 6, 9]] 

     

    • 내가 작성한 코드
    def solution(mylist):
        res = list(zip(*mylist))
        answer = []
        for i in res:
            answer.append([*i])
        return answer

     

    • zip 함수와 unpacking을 이용
    mylist = [ [1,2,3], [4,5,6], [7,8,9] ]
    new_list = list(map(list, zip(*mylist)))

     

    zip 함수

    zip(*iterables)는 각 iterables의 요소들을 모으는 이터레이터를 만든다.

    튜플의 이터레이터를 돌려주는데, i번째 튜플은 각 인자로 전달된 시퀀스나 이터러블의 i번재 요소를 포함한다.

    • 두 리스트의 합들을 출력
    list_1 = [1, 2, 3, 4]
    list_2 = [10, 20, 30, 40]
    
    for i, j in zip(list_1, list_2):
        print(i + j)
    
    # 11
    # 22
    # 33
    # 44

     

    • key 리스트와 value 리스트로 딕셔너리 생성하기
    animals = ['cat', 'dog', 'lion']
    sounds = ['meow', 'woof', 'roar']
    
    answer = dict(zip(animals, sounds))
    
    print(answer)
    # {'lion': 'roar', 'dog': 'woof', 'cat': 'meow'}

     

    모든 멤버의 type 변환하기

    문자열 리스트를 입력 받아서 정수형 리스트로 출력

    • 입력
    ['1', '100', '33']

     

    • 출력
    [1, 100, 33]

     

    • 내가 작성한 코드
    def solution(mylist):
        return [int(i) for i in mylist]

     

     

    위 코드를 실행하면 결과가 제대로 나온다.

    그런데 이유는 잘 모르겠지만 속도가 너무 느리다.

    Why ???

    그래도 처음으로 강의에 나온 코드와 유사한 코드를 작성했다.

     

     

    map 함수 응용하기

    정수를 담은 이차원 리스트가 주어질때 원소의 길이를 출력

    • 입력
    [[1], [2]]
    [[1, 2], [3, 4], [5]]

     

    • 출력
    [1, 1]
    [2, 2, 1]

     

    • 코드
    def solution(mylist):
        answer = list(map(len, mylist))
        return answer

     

    sequence 멤버를 하나로 이어붙이기

    문자열 리스트를 받아서 모두 이어 붙인 문자열을 출력

    • 입력
    a = ['1','234', '55']

     

    • 출력
    '123455'

     

    • 내가 작성한 코드
    def solution(mylist):
        answer = ""
        for i in mylist:
            answer += i
        return answer

     

    • 파이썬의 join 함수를 이용
    def solution(mylist):
        answer = ''.join(mylist)
        return answer

     

    삼각형 별찍기

    정수 n이 주어질때 별(*) 문자를 이용해 높이가 n인 삼격형 출력

    • 입력
    3

     

    • 출력
    *
    **
    ***

     

    • 내가 작성한 코드
    n = int(input().strip())
    
    for i in range(1, n+1):
        print('*'*i)

     

    곱집합(Cartesian product) 구하기 - product

    iterable으로 곱집합을 구하기

    ex) 'ABC', 'xy'의 곱집합은 Ax Ay Bx By Cx Cy 입니다.

    • 파이썬의 itertools.projuct를 이용(참고)
    import itertools
    
    iterable1 = 'ABCD'
    iterable2 = 'xy'
    iterable3 = '1234'
    itertools.product(iterable1, iterable2, iterable3)

     

     

    itertools 에 대해 아직은 잘 모르겠다.

    따로 추가적인 공부가 필요해 보인다.

     

    2차원 리스트를 1차원 리스트로 만들기

    문자열을 담은 2차원 리스트를 1차원 리스트로 만들어 출력

    • 입력
    [[1], [2]]    
    [['A', 'B'], ['X', 'Y'], ['1']]    

     

    • 출력
    [1, 2]
    ['A', 'B', 'X' ,'Y', '1']

     

    • 내가 작성한 코드
    def solution(mylist):
        answer = []
        for i in mylist:
            for j in i:
                answer.append(j)
        return answer

     

    • 반복문을 한번만 사용한 코드
    my_list = [[1, 2], [3, 4], [5, 6]]
    answer = []
    for i in my_list:
        answer += i
    
    print(answer)
    # [1, 2, 3, 4, 5, 6]

     

    • 파이썬의 sum함수를 이용
    my_list = [[1, 2], [3, 4], [5, 6]]
    
    answer = sum(my_list, [])

     

    • itertools.chain 을 이용
    my_list = [[1, 2], [3, 4], [5, 6]]
    
    import itertools
    answer = list(itertools.chain.from_iterable(my_list))

     

    • itertools와 unpacking 을 이용
    my_list = [[1, 2], [3, 4], [5, 6]]
    
    import itertools
    answer = list(itertools.chain(*my_list))

     

    • reduce 함수 이용
    my_list = [[1, 2], [3, 4], [5, 6]]
    
    # 방법 1
    from functools import reduce
    answer = list(reduce(lambda x, y: x+y, my_list))
    
    # 방법 2
    from functools import reduce
    import operator
    answer = list(reduce(operator.add, my_list))

     

    하나의 문제를 푸는데

    엄청 다양한 방법이 있는 것 같다.

    이해가 안되는 부분도 있지만 계속 진도를 나가 보자.

     

     

     

     

     

     

    'Python' 카테고리의 다른 글

    반복문 상태바 라이브러리(tqdm)  (0) 2020.08.17
    파이썬을 파이썬 답게_3  (0) 2019.11.29
    파이썬을 파이썬답게_1  (0) 2019.09.30
    [Python] zip() 함수  (0) 2019.09.10
    Python Anaconda 가상환경 설정하기  (0) 2019.08.29

    댓글

© 2019 All rights reserved.