Stay Hungry Stay Foolish

파이썬 강의/파이썬을 파이썬답게

[파이썬을 파이썬답게] Part 04. Iterable 다루기 (Programmers)

dev스카이 2023. 10. 17. 05:45

🗒 강의노트 🗒

  • sort() : 리스트의 원소를 정렬하는 함수로, 원본의 멤버 순서를 변경한다. 따라서 원본의 순서는 변경하지 않고, 정렬된 값을 구하려면 sort 함수를 사용할 수 없다.
  • sorted() : 매개변수로 들어온 iterable한 데이터를 새로운 정렬된 리스트로 만들어서 반환해 주는 함수다.

 

sort 예시

list1 = [3, 2, 5, 1]
list2 = [i for i in list1] # 또는 copy.deepcopy를 사용
list2.sort()

sorted 예시

list1 = [3, 2, 5, 1]
list2 = sorted(list1)

 문제 1 [ 2차원 리스트 뒤집기 ]

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

다음을 만족하는 함수, solution을 완성해주세요.

  • solution 함수는 이차원 리스트, mylist를 인자로 받습니다
  • solution 함수는 mylist 원소의 행과 열을 뒤집은 한 값을 리턴해야합니다.

예를 들어 mylist [[1, 2, 3], [4, 5, 6], [7, 8, 9]]가 주어진 경우, solution 함수는 [[1, 4, 7], [2, 5, 8], [3, 6, 9]] 을 리턴하면 됩니다.

 

제한 조건

  • mylist의 원소의 길이는 모두 같습니다.
  • mylist의 길이는 mylist[0]의 길이와 같습니다.
  • 각 리스트의 길이는 100 이하인 자연수입니다.

 

☑ Solution

def solution(mylist):
    answer = [[] * len(mylist) for _ in range(len(mylist))]
    for i in range(len(mylist)):
        for j in range(len(mylist[i])):
            answer[i].append(mylist[j][i])
    return answer

계속 틀리는 바람에 강의노트를 보고 풀었다. 보통은 2중 for문을 이용한다고 한다.

주의할 점은 answer = [[ ]] 로 초기화를 하면 out of range 오류가 떠서 입력값에 맞게 초기화를 시켜줘야 한다.

 

✔ Feedback ✔

def solution(mylist):
    return list(map(list, zip(*mylist)))
  • zip(*iterables) : 각 iterables 의 요소들을 모으는 iterator를 만든다.
    튜플의 iterator를 돌려주는데, i 번째 튜플은 각 인자로 전달된 시퀀스나 이터러블의 i 번째 요소를 포함한다.

다시 말해, 여러 개의 순회 가능한(iterable) 객체를 인자로 받고, 각 객체가 담고 있는 원소를 터플의 형태로 차례로 접근할 수 있는 반복자(iterator)를 반환한다.

 

예시 1

mylist = [1, 2, 3]
new_list = [40, 50, 60]
for i in zip(mylist, new_list):
    print (i) #(1, 40) (2, 50) (3, 60)

 

 

예시 2

list1 = [1, 2, 3, 4]
list2 = [100, 120, 30, 300]
list3 = [392, 2, 33, 1]
answer = []
for number1, number2, number3 in zip(list1, list2, list3):
   print(number1 + number2 + number3)

 

예시 3 (Key 리스트와 Value 리스트로 딕셔너리 생성하기)

animals = ['cat', 'dog', 'lion']
sounds = ['meow', 'woof', 'roar']
answer = dict(zip(animals, sounds)) # {'cat': 'meow', 'dog': 'woof', 'lion': 'roar'}

파이썬의 zip 함수와 dict 생성자를 이용하면 코드 단 한 줄로, 두 리스트를 합쳐 딕셔너리로 만들 수 있다.


문제 2 [ i번째 원소와 i+1번째 원소 ]

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

숫자를 담은 리스트 mylist가 solution 함수의 파라미터로 주어집니다. solution 함수가 mylist의 i번째 원소와 i+1번째 원소의 차를 담은 일차원 리스트에 차례로 담아 리턴하도록 코드를 작성해주세요. 단, 마지막에 있는 원소는 (마지막+1)번째의 원소와의 차를 구할 수 없으니, 이 값은 구하지 않습니다.

 

제한 조건

  • mylist의 길이는 1 이상 100 이하인 자연수입니다.
  • mylist의 원소는 1 이상 100 이하인 자연수입니다.

 

입출력 예

  • 83과 48의 차는 35입니다.
  • 48과 13의 차는 35입니다.
  • 13과 4의 차는 9입니다.
  • 4와 71의 차는 67입니다.
  • 71과 11의 차는 60입니다.

따라서 [35, 35, 9, 67, 60]를 리턴합니다.

 

☑ Solution

def solution(mylist):
    for i in range(1,len(mylist)):
        mylist[i-1] -= mylist[i]
        if i == len(mylist)-1:
            mylist.pop(i)
    return list(map(abs,mylist))

보통은 len과 index를 사용해서 각 원소에 접근한다. 리스트에서 두 개씩 꺼내고 싶었는데 잘 안 됐다.

 

✔ Feedback ✔

def solution(mylist):
    answer = []
    for a, b in zip(mylist, mylist[1:]):
        answer.append(abs(a-b))
    return answer
  • 파이썬의 zip을 이용하면 index를 사용하지 않고 각 원소에 접근할 수 있다.
  • 주의할 점 : zip 함수에 서로 길이가 다른 리스트가 인자로 들어오는 경우에는 길이가 짧은 쪽 까지만 이터레이션이 이루어진다. 더 자세한 내용은 공식 레퍼런스 - zip 참고

문제 3 [ 모든 멤버의 type 변환하기 ]

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문자열 리스트 mylist를 입력받아, 이 리스트를 정수형 리스트로 바꾼 값을 리턴하는 함수, solution을 만들어주세요. 예를 들어 mylist가 ['1', '100', '33'] 인 경우, solution 함수는 [1, 100, 33] 을 리턴하면 됩니다.

 

제한 조건

  • mylist의 길이는 100 이하인 자연수입니다.
  • mylist의 원소는 10진수 숫자로 표현할 수 있는 문자열입니다. 즉, 'as2' 와 같은 문자열은 들어있지 않습니다.

입출력 예

 

☑ Solution 1

def solution(mylist):
    return list(map(int, mylist))

☑ Solution 2

def solution(mylist):
    return [int(i) for i in mylist]
  • map(function, iterable) : Iterable의 모든 멤버의 type을 변환할 수 있다.

처음엔 map함수를 써서 풀었고, 두 번째는 반복문을 이용해 풀었다. 강의노트에서는 map함수를 추천했다.


 

☐ 문제 4 [ map 함수 응용하기 ]

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

제한 조건

  • mylist의 길이는 100 이하인 자연수입니다.
  • mylist 각 원소의 길이는 100 이하인 자연수입니다.

 

입출력 예

 

☑ Solution

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

누군가 len에 관해 질문을 했는데 새로 알게 돼서 적어본다.

map은 두번째 인자의 각 원소에 첫번째 인자로 들어온 함수를 적용해줍니다.

•  함수뒤에 ()를 붙이면, 이는 더 이상 함수가 아니라 함수가 리턴한 값을 의미합니다.즉,
•  len -> 함수를 의미함len() -> 함수를 호출하여 받은 리턴값을 의미함