🗒 강의노트 🗒
- 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차원 리스트 뒤집기 ]
다음을 만족하는 함수, 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번째 원소 ]
숫자를 담은 리스트 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 변환하기 ]
문자열 리스트 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 함수 응용하기 ]
제한 조건
- mylist의 길이는 100 이하인 자연수입니다.
- mylist 각 원소의 길이는 100 이하인 자연수입니다.
입출력 예
☑ Solution
def solution(mylist):
answer = list(map(len, mylist))
return answer
누군가 len에 관해 질문을 했는데 새로 알게 돼서 적어본다.
map은 두번째 인자의 각 원소에 첫번째 인자로 들어온 함수를 적용해줍니다.
• 함수뒤에 ()를 붙이면, 이는 더 이상 함수가 아니라 함수가 리턴한 값을 의미합니다.즉,
• len -> 함수를 의미함len() -> 함수를 호출하여 받은 리턴값을 의미함
'파이썬 강의 > 파이썬을 파이썬답게' 카테고리의 다른 글
[파이썬을 파이썬답게] Part 06. Itertools / Collections 모듈 (Programmers) (1) | 2023.10.17 |
---|---|
[파이썬을 파이썬답게] Part 05. Sequence Types 다루기 (Programmers) (1) | 2023.10.17 |
[파이썬을 파이썬답게] Part 03. Str 다루기 (Programmers) (1) | 2023.10.16 |
[파이썬을 파이썬답게] Part 02. 정수 다루기 (Programmers) (1) | 2023.10.16 |
[파이썬을 파이썬답게] Part 01. Python 꿀팁 (Programmers) (0) | 2023.10.16 |