원본을 유지한채, 정렬된 리스트를 구하는 방법
보통의 다른언어는 deepcopy 와 sorted함수를 이용한다고 한다(다른언어를 이렇게 까지 해본경험이 없다 ..)
다른언어의 예시는
list1 = [3,2,1]
list2 = [i for i in list1]
list2.sort()
파이썬은 간단하게 이렇게 가능하다.
list1 = [3,2,1]
list2 = sorted(list1)
이차원함수의 list뒤집기를 통한 zip학습이다.
for문으로 풀어내고싶었으나 도저히 내머리로는 불가능한것인가..
문제가 두가지 있다
list내부의 list에접근하여 내부리스트의 첫번째에 해당하는값을 뽑아오는것이 되지 않는다
For 문을 사용하면 내부리스트 각각에게는 접근이 가능하나 그 내부의 리스트에 또 접근하려면 또 for문을 써야한다.
그렇다면 그렇게 들어간 내부리스트에 각각 indexing을 하여 또 값을 빼와야하는데 이걸 언제 다하나
아니 이렇게 하는것이 맞는가 ㅇㅁㅇ..?
그렇게 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 함수를 하도 써서 그런지 대충 사용법은 익히고 있던지라
아래의 문제는 쉽게 풀었다.
다만 이문제를 반복문을 통하여 풀려면 풀 수 있을 것인가가 문제이다.
문자열 리스트 mylist를 입력받아, 이 리스트를 정수형 리스트로 바꾼 값을 리턴하는 함수, solution을 만들어주세요. 예를 들어 mylist가 ['1', '100', '33'] 인 경우, solution 함수는 [1, 100, 33] 을 리턴하면 됩니다.
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
문자열의 원소를 이어붙인 함수를 작성하는것이 문제였다.
나는 이렇게 시도했다.
당연히 안됨 ㅋ
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)
해당문제는 파이썬의 있는 '*' 연산자의 획기적인 사용법을 이야기해주는 것 같다.
문자열 반복출력에 있어 해당연산자를 사용하여 반복출력이 가능하다거나 뭐 그런것..