TIL-no.24 python advanced 2

sanghun Lee·2020년 7월 8일
0

Today I Learned

목록 보기
22/66

참고한사이트

1. sorted

원본을 유지한채, 정렬된 리스트를 구하는 방법

보통의 다른언어는 deepcopy 와 sorted함수를 이용한다고 한다(다른언어를 이렇게 까지 해본경험이 없다 ..)
다른언어의 예시는

list1 = [3,2,1]
list2 = [i for i in list1]
list2.sort()

파이썬은 간단하게 이렇게 가능하다.

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

2. zip

이차원함수의 list뒤집기를 통한 zip학습이다.

for문으로 풀어내고싶었으나 도저히 내머리로는 불가능한것인가..
문제가 두가지 있다

  1. list내부의 list에접근하여 내부리스트의 첫번째에 해당하는값을 뽑아오는것이 되지 않는다
    For 문을 사용하면 내부리스트 각각에게는 접근이 가능하나 그 내부의 리스트에 또 접근하려면 또 for문을 써야한다.
    그렇다면 그렇게 들어간 내부리스트에 각각 indexing을 하여 또 값을 빼와야하는데 이걸 언제 다하나
    아니 이렇게 하는것이 맞는가 ㅇㅁㅇ..?

  2. 그렇게 indexing을한다면 새로운 empty list를 만들어 나열을하고 또 다른 list안에 append하면 되는가
    이런 생각이 들며 포기하고(이러면 안되는데) 구글링을 통해 zip을 이용했다.

문제:

다음을 만족하는 함수, 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]] 을 리턴하면 됩니다.
def solution(mylist):
	return list(map(list, zip(*mylist)))

구글링을통해 풀고 난뒤 해설을 보니
생각했던것과 비슷한 방법으로 풀어서 내가 돌은 아닌 것 같다.
zip을통한 파이써닉한 방법은 써먹었으니 다른언어적인 방법을 한번 보자.

def solution(mylist):
    answer = []
    for i in range(len(mylist)): 
        answer.append([]) # 2번생각
    for i in range(len(mylist)): # 1번생각
        for j in range(len(mylist[i])): #1번생각
            answer[i].append(mylist[j][i]) # 2번생각
    return answer

이차원 리스트의 개념을 기억하기 위해 유용한 것들을 아래와 같이 기입해야겠다.
참고: 코딩도장

2차원배열의 기본 개념인 바둑판 모양이다.


2차원 배열 호출? 인덱싱? 또는 추가? 를 위한 방법이다 . append를 이용

2차원 리스트에서 for 반복문을 두번 사용하여 이렇게 리스트를 꺼내올 수 있다.

일단 2차원 리스트의 기본적인 개념은 이러하다

이를 활용하는zip함수는 각 iterables의 요소들을 모으는 iterator를 만든다고 한다.
무슨말인지 모르겠지만 예시를 보자

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

각 첫번째 요소에 해당하는것들이 tuple로 묶여서 나온다.

list1 = [1,2,3,4]
list2 = [100,120,130,440]
list3 = [55,22,44,1]
answer = []
for i, j, k in zip(list1, list2, list3):
	print(i+j+k)
#output
156
144
177
445

각 자리마다의 합이 나온다.(굉장히 유용함)
그리고 Dictionary도 간단하게 list 2개를 사용하여 만들어 낼 수 있다.

number = [1,2,3]
human = ['lee','kang','son']
answer = dict(zip(number,human))
#output
{1: 'lee', 2: 'kang', 3: 'son'}

Map을 이용한 type 변경

예전에 코드업에서 문제를 풀 때 map 함수를 하도 써서 그런지 대충 사용법은 익히고 있던지라
아래의 문제는 쉽게 풀었다.
다만 이문제를 반복문을 통하여 풀려면 풀 수 있을 것인가가 문제이다.

  • 문제
문자열 리스트 mylist를 입력받아, 이 리스트를 정수형 리스트로 바꾼 값을 리턴하는 함수, solution을 만들어주세요. 예를 들어 mylist가 ['1', '100', '33'] 인 경우, solution 함수는 [1, 100, 33] 을 리턴하면 됩니다.
  • map 함수 사용풀이
def solution(mylist):
    return list(map(int, mylist))
  • 반복문을 이용한 풀이
def solution(mylist):
	answer = []
    for i in mylist:
    	answer.append(int(i))
    return answer 

파이썬은 참 좋은 언어이다.

아래와 같이 각 길이도 return 시킬 수 있다.

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

join

문자열의 원소를 이어붙인 함수를 작성하는것이 문제였다.

나는 이렇게 시도했다.
당연히 안됨 ㅋ

def solution(mylist):
	for i in mylist:
		i += i
    answer = i
	return answer
    

일단 이 문제에서 놓친부분은 빈 string 변수를 만들어 놓지않고 할당했다는 점.
따라서 아래와 같이 빈 string 변수를 만들고 실행하니 테스트가 통과되었다.

def solution(mylist):
	answer = ''
	for i in mylist:
    	answer += i
    return answer

하지만 파이썬에서는 이렇게 반복문을 돌리기 보다는 join을 사용하면 쉽게 이어붙일 수 있다.

def solution(mylist):
	answer = ''.join(mylist)
    return answer

삼각형 별찍기

입력된 정수 n 만큼 별을 찍어내 삼각형 만들기

일단 나는 기존에 하던대로 반복문을 사용하여 만들었다

n = int(input().split()) # strip은 괄호안의 것을 짤라서 출력해줌
for i in range(1, n+1,1):
	print('*'*i)

해당문제는 파이썬의 있는 '*' 연산자의 획기적인 사용법을 이야기해주는 것 같다.
문자열 반복출력에 있어 해당연산자를 사용하여 반복출력이 가능하다거나 뭐 그런것..

profile
알고리즘 풀이를 담은 블로그입니다.

0개의 댓글