[파이썬을 파이썬답게] Iterable 다루기

pengu·2021년 3월 14일
0

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

🔔 강의 Tip

파이썬의 sort()함수를 이용하면 리스트의 원소를 정렬할 수 있지만, 이 때 sort()함수는 원본의 멤버 순서를 변경한다.

sorted()함수를 사용하면 원본의 순서는 변경하지 않고 정렬된 값을 구할 수 있다.

  list1 = [3, 2, 1]
  
  ## 1. deep copy와 sort()함수를 이용하여 순서를 변경
  list2 = [i for i in list1] # 또는 copy.deepcopy를 사용
  list2.sort()

  ## 2. sorted()함수를 이용하여 순서를 변경
  list3 = sorted(list1)



📙 2차원 리스트 뒤집기

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

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

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

입출력 예

mylistoutput
[[1, 2, 3], [4, 5, 6], [7, 8, 9]][[1, 4, 7], [2, 5, 8], [3, 6, 9]]

🔔 내 풀이

answer = []
for i in range(0, len(mylist)):
      tmp = []
      for j in range(0, len(mylist)):
          tmp.append(mylist[j][i])
      answer.append(tmp)
return answer

🔔 강의 Tip

파이썬의 zip()함수와 unpacking을 이용하여 리스트를 뒤집을 수 있다.

new_list = list(map(list, zip(*mylist)))

Zip 함수

zip(*iterables)

zip(*iterables)는 각 iterables의 요소들을 모으는 iterator를 만듦
튜플의 iterator를 돌려주는데, i 번째 튜플은 각 인자로 전달된 sequence나 iterable의 i 번째 요소를 포함

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

예제 1 - 여러 개의 Iterable 동시에 순회
list1 = [1, 2, 3, 4]
list2 = [100, 120, 30, 300]
list3 = [392, 2, 33, 1]

for number1, number2, number3 in zip(list1, list2, list3):
    print(number1 + number2 + number3)

#출력 결과
493 # 1+100+392
124 # 2+120+2
66  # 3+30+33
305 # 4+300+1

예제 2 - Key 리스트와 Value 리스트로 딕셔너리 생성하기

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

✔ zip 함수에 서로 길이가 다른 리스트가 인자로 들어오는 경우에는 길이가 짧은 쪽 까지만 이터레이션이 이루어짐



📙 i번째 원소와 i+1번째 원소

문제 설명
숫자를 담은 리스트 mylist가 solution 함수의 파라미터로 주어집니다. solution 함수가 mylisti번째 원소와 i+1번째 원소의 차를 담은 일차원 리스트에 차례로 담아 리턴하도록 코드를 작성해주세요.

단, 마지막에 있는 원소는 (마지막+1)번째의 원소와의 차를 구할 수 없으니, 이 값은 구하지 않습니다.

제한 조건

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

입출력 예

mylistoutput
[83, 48, 13, 4, 71, 11][35, 35, 9, 67, 60]
- 83과 48의 차는 35입니다.
- 48과 13의 차는 35입니다.
- 13과 4의 차는 9입니다.
- 4와 71의 차는 67입니다.
- 71과 11의 차는 60입니다.
따라서 [35, 35, 9, 67, 60]를 리턴합니다.

🔔 내 풀이

answer = []
for i in range(0, len(mylist)-1):
    answer.append(abs(mylist[i] - mylist[i+1]))
return answer      

🔔 강의 Tip

파이썬의 zip() 함수를 이용하여 index를 사용하지 않고 각 원소에 접근할 수 있다.

answer = []
for number1, number2 in zip(mylist, mylist[1:]):
    answer.append(abs(number1 - number2))
return answer



📙 모든 멤버의 type 변환하기

문제 설명
문자열 리스트 mylist를 입력받아, 이 리스트를 정수형 리스트로 바꾼 값을 리턴하는 함수, solution을 만들어주세요.
제한 조건

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

입출력 예

mylistoutput
['1', '100', '33'][1, 100, 33]

🔔 내 풀이

answer = []
for num in mylist:
    answer.append(int(num))
return answer

🔔 강의 Tip

파이썬의 map() 함수를 이용하여 멤버의 타입을 일괄 변환할 수 있다.

return list(map(int, mylist))

Map 함수

map(function, iterable, ...)

입력받은 자료형의 각 요소에 함수 f를 적용한 결과를 묶어서 리턴



📙 map 함수 응용하기

문제 설명
정수를 담은 이차원 리스트, mylist 가 solution 함수의 파라미터로 주어집니다. solution 함수가 mylist 각 원소의 길이를 담은 리스트를 리턴하도록 빈칸을 완성해보세요.

hint) 이전 강의에서 배운 map 함수를 활용해보세요

제한 조건

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

입출력 예

mylistoutput
[[1], [2]][1, 1]
[[1, 2], [3, 4], [5]][2, 2, 1]

🔔 내 풀이

answer = list(map(len, mylist))
   return answer

Programmers - 파이썬을 파이썬답게 https://programmers.co.kr/learn/courses/4008

profile
꾸준하게

0개의 댓글