파이썬 파트14. 리스트 더 알아보기 - split, join, slice

|

파이썬 파트14. 리스트 더 알아보기

try hello world 파이썬 입문 강의

리스트가 가진 다양한 기능

  • list.index( value ) : 값을 이용하여 위치를 찾는 기능
  • list.extend( [value1, value2] ) : 리스트 뒤에 값을 추가 (‘+’연산자 보다 성능이 좋음)
  • list.insert( index, value ) : 원하는 위치에 값을 추가
  • list.sort( ) : 값을 순서대로 정렬
  • list.reverse( ) : 값을 역순으로 정렬
>>> list1 = ['a', 'b', 'q', 'f']
>>> list1.index('b')
1

>>> list2 = [1, 2, 3]
>>> list1.extend(list2)
>>> list1
['a', 'b', 'q', 'f', 1, 2, 3]


>>> list1.insert(1, 'hi')
>>> list1
['a', 'hi', 'b', 'q', 'f', 1, 2, 3]

>>> list1.sort()
>>> list1
[1, 2, 3, 'a', 'b', 'f', 'hi', 'q']

>>> list1.reverse()
>>> list1
['q', 'hi', 'f', 'b', 'a', 3, 2, 1]

list와 string - .split(), .join()

  • 리스트와 문자열은 유사하다.
>>> my_list = [1, 9, 8, 5, 0, 6]
>>> my_str = 'hello world'
>>> 5 in my_list
True
>>> 'e' in my_str
True
  • 서로 변환이 가능하다.
    • list = str.split() : 문자열 => 리스트, 공백시 스페이스 기준
    • ” “.join( list ) : 리스트에서 문자열으로
>>> char = list('hello')
>>> char
['h', 'e', 'l', 'l', 'o']

# string => list
>>> words = "python은 프로그래밍을 배우기에 아주 좋은 언어입니다."
>>> words_list = words.split()
>>> words_list
['python은', '프로그래밍을', '배우기에', '아주', '좋은', '언어입니다.']

>>> time_str = "10:34:17"
>>> time_str.split(':')
['10', '34', '17']

# list => string
>>> time_list
['10', '34', '17']
>>> ':'.join(time_list)
'10:34:17'

slice

  • slicing : 리스트나 문자열에서 값을 여러개 가져오는 기능
  • list[ 시작:끝] 시작은 포함 되지만 끝 값은 포함되지 않는다.
text = "hello world"
text = text[ 1:5 ] #index 1부터 ~ index 5 전(4)까지

list = [ 0, 1, 2, 3, 4, 5 ]
list = list[ 1:3 ]
  • slice를 하면 해당하는 부분의 리스트나 문자열을 새로 만들어 준다.
  • 시작과 끝부분을 얻어 오는 방법
    • list[ 2: ] : 2번째부터 끝까지 반환
    • list[ : 2 ] : 처음부터 2번째 까지 반환
    • list[ : ] : 처음부터 끝까지 전부 반환 (리스트를 복사해 둘 때 유용하게 사용됨)

step

  • slice한 값의 범위에서 step 값을 주어 그 값만큼 건너뛰어 가져오는 기능
  • list[ 시작값:끝값:step ]
>>> list1 = list(range(20))
>>> list1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

>>> list1[5:15:3]
[5, 8, 11, 14]
>>> list1[15:5:-1]
[15, 14, 13, 12, 11, 10, 9, 8, 7, 6]
>>> list1[::3]
[0, 3, 6, 9, 12, 15, 18]
>>> list1[::-3]
[19, 16, 13, 10, 7, 4, 1]

slice로 리스트 수정하기

  • 삭제
    • del list[ :5 ] : 처음부터 5번째 전까지 삭제
    • 참고 : del 함수는 파이썬이 자체적으로 가지고 있는 삭제 함수이며 다음과 같이 사용한다.
del 객체
# 객체란 파이썬에서 사용되는 모든 자료형을 말한다.
  • 수정
    • list[ 1:3 ] = [ 77, 88 ]
    • list[ 1:3 ] = [ 77, 88 ,99 ] : 더 많은 개수로 변환
    • list[ 1:4 ] = [ 8 ] : 더 적은 개수로 변환
>>> numbers = list(range(10))
>>> numbers
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 삭제
>>> del numbers[:5]
>>> numbers
[5, 6, 7, 8, 9]

# 수정
>>> numbers[1:3] = [66, 77]
>>> numbers
[5, 66, 77, 8, 9]

파이썬 파트13. 논리연산과 if문 더 알아보기

|

파이썬 파트13. 논리연산과 if문 더 알아보기

try hello world 파이썬 입문 강의

논리연산의 단락평가

  • 단락평가 : 논리연산에서 코드의 앞만 보고 값을 정할 수 있는 경우 뒤는 보지 않고 값을 결정
  • 복잡한 코드를 단순하게 하는 방식
dic = { 'key2' : 'value2' }

if 'key1' in dic and dic['key1'] == 'value2': # 단락평가를 통해 첫번째 조건이 false 이기에 바로 확인 종료
# if dic['key1'] == 'value2' and 'key1' in dic: => dic['key1'] 에서 에러 발생
    print('있네!')
else:
    print('없네..')

bool 값과 논리연산의 활용

  • 숫자 0을 제외한 모든 수 - true
  • 빈 딕셔너리, 빈 리스트를 제외한 모든 딕셔너리, 리스트 - true
  • 아무 값도 없다는 의미인 None - false
  • 빈문자열을 제외한 모든 문자열 - true
>>> bool(9) #True
>>> bool(-1) #True
>>> bool(0) #False
>>> bool(None) #False
>>> bool('') #False
>>> bool([]) #False

논리연산의 활용

  • 파이썬을 더 강력하게 만들어 주는 도구
value = input('입력해주세요>') or '아무것도 없어'
# input이 빈 경우 값은 false => 단락평가로 인해 or 뒤의 값으로 적용됨
print('입력값 : ', value)
# input 값이 있는경우 input 값, 없는경우 '아무것도 없어' 출력  

파이썬 파트12. 예외처리 - try / except, raise

|

파이썬 파트12. 예외처리

try hello world 파이썬 입문 강의

try / except

  • 파이썬으로 프로그래밍 중에 다양한 에러가 발생할 수 있다. 이 에러가 발생하는 예외상황은 유연하게 프로그래밍을 할 수 있는 도구가 되기도 한다.

에러 예시

# IndexError
>>> list = []
>>> list[0]
IndexError: list index out of range

# ValueError
>>> text = 'abc'
>>> number = int(text)
ValueError: invalid literal for int() with base 10: 'abc'

try / except문 사용 예시

  • 에러가 발생할 것 같은 코드를 try안에 넣고 except 뒤에 발생할 수 있는 에러의 이름을 적어두면, 에러 발생시 프로그램이 멈추지 않고 별도 처리가 가능하다.
views
exception 처리
text = '100%'

try :
    number = int(text) # 에러가 발생할 가능성이 있는 코드
except ValueError :  # 에러 종류
    print('{}는 숫자가 아닙니다.'.format(text))  #에러가 발생 했을 경우 처리할 코드
  • 경우에 따라 예외 처리 대신 if else를 사용 할 수 있다.
    더 간결한 것이나, if문을 사용하는 것이 좋다.
# try-except 문
def safe_pop_print(list, index):
    try:
        print(list.pop(index))
    except IndexError:
        print('{} index의 값을 가져올 수 없습니다.'.format(index))

safe_pop_print([1,2,3], 5) # 5 index의 값을 가져올 수 없습니다.

# if 문
def safe_pop_print(list, index):
    if index < len(list):
        print(list.pop(index))
    else:
        print('{} index의 값을 가져올 수 없습니다.'.format(index))

safe_pop_print([1,2,3], 5) # 5 index의 값을 가져올 수 없습니다.
  • try 문으로만 해결이 가능한 문제도 있다.
try:
    import your_module
except ImportError:
    print('모듈이 없습니다.')

예외 이름을 모르는 경우 처리 방법

# 모든 에러 처리
try:
    list = []
    print(list[0])  # 에러가 발생할 가능성이 있는 코드

    text = 'abc'
    number = int(text)
except:
    print('에러발생')

# 에러 이름 확인
try:
    list = []
    print(list[0])  # 에러가 발생할 가능성이 있는 코드

except Exception as ex: # 에러 종류
    print('에러가 발생 했습니다', ex) # ex는 발생한 에러의 이름을 받아오는 변수
    # 에러가 발생 했습니다 list index out of range

에러를 직접 일으키는 방법 - raise

  • 사용자가 직접 에러를 발생시키는 기능
  • 많이 사용하면 코드를 읽기 어려워진다.
# 올바른 값을 넣지 않으면 에러를 발생시키고 적당한 문구를 표시한다.
def rsp(mine, yours):
    allowed = ['가위','바위', '보']
    if mine not in allowed:
        raise ValueError
    if yours not in allowed:
        raise ValueError

try:
    rsp('가위', '바')
except ValueError:
    print('잘못된 값을 넣었습니다!')
# 190이 넘는 학생을 발견하면 반복을 종료한다.
school = {'1반' : [150, 156, 179, 191, 199], '2반' : [150, 195, 179, 191, 199]}

try:
    for class_number, students in school.items():
        for student in students:
            if student > 190:
                print(class_number, '190을 넘는 학생이 있습니다.')
                # break # 바로 상위 for문은 종료되지만 최고 상위 for문은 종료되지 않는다.
                raise StopIteration
                # 예외가 try 문 안에 있지 않으면 에러 발생시 프로그램이 멈춘다.
except StopIteration:
    print('정상종료')                

파이썬 파트11. while문과 반복 제어 break, continue

|

파이썬 파트11. while문과 반복 제어

try hello world 파이썬 입문 강의

while문 쓰기

  • 조건이 참인 경우 계속 실행하는 반복 문
selected = None
while selected not in ['가위', '바위', '보']:
    selected = input('가위 바위 보 중에 선택하세요 >')
print('선택한 값은 : ', selected)
  • if 문은 조건이 맞으면 한번만 실행 하지만 while 반복문은 조건이 맞다면 계속 반복
  • for 반복문으로 작성한 코드는 while 반복문으로도 작성 할 수 있다.
  • 상황에 맞는 반복문을 사용 할 것
patterns = ['가위', '보', '보']
# for in 문
for i in range(len(patterns)): # 0~2
    print(patterns[i])

# while 문
i = 0
while i < len(patterns) :
    print(patterns[i])
    i = i + 1

break, continue

break

  • 반복문을 종료 시키는 기능
list = [1, 2, 3, 4, 5, 6, 66, 90, 100]

for val in list:
    if val % 3 == 0:
        print(val)
        break
        # 3 만 출력하고 반복문 종료
        # break의 상위 블럭중에 첫번째 반복문을 찾아서 종료시킨다.

continue

  • 반복문의 나머지 부분을 보지 않고, 반복문의 처음으로 돌아가는 기능
# 홀수를 4번 3번 출력
for i in range(10) :
    if i % 2 != 0 :
        print(i)
        print(i)
        print(i)

# 홀수를 4번 3번 출력 - continue 활용
for i in range(10) :
    if i % 2 = 0 :
        continue  # 반복문의 나머지를 실행시키지 않고 처음으로 돌아간다
    print(i)
    print(i)
    print(i)
# 제외하는 경우를 첫번째에 처리해서 핵심이 되는 부분이 너무 깊게 들어가지 않다록 한다.

level 1. 행렬의 덧셈

|

level 1. 행렬의 덧셈

출처

문제

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행,같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬을 입력받는 sumMatrix 함수를 완성하여 행렬 덧셈의 결과를 반환해 주세요.

예를 들어 2x2 행렬인 A = ((1, 2), (2, 3)), B = ((3, 4), (5, 6)) 가 주어지면, 같은 2x2 행렬인 ((4, 6), (7, 9))를 반환하면 됩니다. (어떠한 행렬에도 대응하는 함수를 완성해주세요.)

느낀 점

자바스크립트

  • 2차원 배열을 만드는 것이 어려웠다. (answer[i] = [] 으로 빈 배열 속 배열을 만든다)
  • .map() 메소드를 잘 활용하자. 참고
  • 화살표 함수에 익숙해지자.참고

파이썬

  • list comprehension을 활용하면 원하는 리스트 만들기가 정말 편하다.
  • zip을 활용해서 2개 이상의 리스트를 활용해서 원하는 리스트를 만들 수 있다.
  • 2차원 리스트를 만드는 것이 어려웠다.
    (answer = [[] for j in range(len(A))] 으로 리스트 A 길이만큼의 2차원 리스트를 만든다.)
  • 리스트의의 길이만큼 반복하려면 for j in range(len(A)) 를 사용한다.
  • 빈 2차원 리스트에 값을 넣으려면 a[0].append(1)를 사용한다. (a[0][0] = 1는 IndexError 발생)

풀이 (python, Javascript)

python - 풀이 1

def sumMatrix(A,B):
    answer = [[c + d for c, d in zip(a, b)] for a, b in zip(A,B)]
    return answer


# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(sumMatrix([[1,2], [2,3]], [[3,4],[5,6]]))

python - 풀이 2

def sumMatrix(A,B):
    answer = [[] for j in range(len(A))]  
    for i in range(len(A)):
        for x in range(len(A[i])):
            answer[i].append(A[i][x] + B[i][x])
    return answer

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(sumMatrix([[1,2], [2,3]], [[3,4],[5,6]]))

Javascript

function sumMatrix(A,B){
	var answer = Array();
	for(var i = 0; i < A.length; i++){
		answer[i] = [];
			for(var j = 0; j < A[i].length; j++){
				answer[i][j] = A[i][j] + B[i][j];				
			}
		}
	return answer;
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log(sumMatrix([[1,2], [2,3]], [[3,4],[5,6]]))

다른사람 풀이

python

def sumMatrix(A,B):
    answer = [[A[i][j] + B[i][j] for j in range(len(A[0]))] for i in range(len(A))]

    return answer

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(sumMatrix([[1,2], [3,4]], [[3,4],[5,6]]))

Javascript

function sumMatrix(A,B){
  return A.map((a,i) => a.map((b, j) => b + B[i][j]));
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log(sumMatrix([[1,2], [2,3]], [[3,4],[5,6]]))

// 화살표 함수를 풀어 쓴 코드
function sumMatrix(A,B){
    return A.map(function(a, i){
             return a.map(function(b, j){
                     return b + B[i][j]
                   })
         })
}