반응형

1. 2차원 리스트

아직도 행과 열의 방향이 헷갈린다

2차원 리스트는 1차원리스트를 묶어놓은 list로 세로길이와 가로기링를 필요로 한다.

 

2. 2차원 리스트 만들기

 

  - 리스트의 행 과 열 M, N을 받아오는 경우

N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
print(arr)

input 값이 아래와 같은 경우 N = 2, M = 3이 할당된다 (N의 값은 생략 해도 된다)

# input 값
# 2 3
# 1 2 3
# 4 5 6

# 출력 값
[[1, 2, 3], [4, 5, 6]]

- 비어있는 리스트 만들기

arr = [[0] * M for _ in range(N)]

0의 값을 가지고 있는 M*N 크기의 2차원 리스트 만들기

 

아래의 방법으로도 가능하다

arr = [[0]*M]*N

하지만 이 방법으로 2차원 리스트를 만들면 값을 얉은 복사로 불러오기 때문에 값에 접근하면 문제가 생길 수 있다

arr = [[0]*M]*N

arr[0][1] = 1

print(arr)


# 출력값
#[[0, 1, 0], [0, 1, 0]]

arr[0][1]의 값을 변경해주었는데 해당 값을 참조하는 arr[1][1]의 값도 1로 바뀐다.

 

3. 리스트 값에 접근하기

arr[i][j]

i = 세로 인덱스

j = 가로 인덱스 입력을 통해 값에 접근 가능하다.

반응형
반응형

파이썬 공식문서

list.append(x)
리스트의 끝에 항목을 더합니다. a[len(a):] = [x] 와 동등합니다.

list.extend(iterable)
리스트의 끝에 이터러블의 모든 항목을 덧붙여서 확장합니다. a[len(a):] = iterable 와 동등합니다.

직접 해보기

int로 이루어진 list

my_list_1 = [1, 2, 3]
my_list_2 = [4, 5, 6]

 

 

my_list_1.append(my_list_2)
print(my_list_1)
[1, 2, 3, [4, 5, 6]]

-> my_list_2 의 항목이 한번에 들어가서 2중 리스트의 형태를 만든다

my_list_1.append(4)
print(my_list_1)
[1, 2, 3, 4]

-> 4가 리스트로 감싸지지 않아 바로 리스트에 들어간다

my_list_1.extend(my_list_2)
print(my_list_1)
[1, 2, 3, 4, 5, 6]

-> my_list_2의 항목이 순서대로 돌며 my_list_1의 뒤에 추가된다

my_list_1.extend(4)
print(my_list_1)
my_list_1.extend(4)
TypeError: 'int' object is not iterable

-> 4는 iterable한 인자가 아니라 TypeError를 일으킨다

 

str으로 이루어진 list

my_list_3 = ['apple', 'banana']
my_list_4 = ['coffe', 'milk']

 

my_list_3.append(my_list_4)
print(my_list_3)
['apple', 'banana', ['coffe', 'milk']]

-> my_list_4의 항목이 리스트 통채로 들어간다

my_list_3.append('grape')
print(my_list_3)
['apple', 'banana', 'grape']

-> grape 항목이 그대로 추가된다

my_list_3.extend(my_list_4)
print(my_list_3)
['apple', 'banana', 'coffe', 'milk']

-> 리스트의 항목이 개별적으로 추가된다

my_list_3.extend('grape')
print(my_list_3)
['apple', 'banana', 'g', 'r', 'a', 'p', 'e']

-> 문자열 'grape'를 돌며 요소 하나하나씩 list에 추가된다

 

 

개인적인 생각으론 .append()는 입력된 값을 통채로 집어넣는다

.extend()는 입력된 값을 순회하며 값을 하나씩 분리해서 집어넣는다고 느끼면 될 것 같다

반응형
반응형

list에서 사용할 수 있는 메서드들을 복습겸 정리해봤다

dir(list)

dir(list)로 리스트에서 사용할 수 있는 메서드들을 모두 출력해서 확인 할 수 있다

list_method = dir(list)
print(list_method)

실행결과

'__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__','append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'

append(x)

리스트에 요소 추가

my_list.append(10)
print(my_list)
[1, 3, 5, 7, 9, 8, 4, 6, 2, 10]

copy()

리스트 복사

my_list_2 = my_list.copy()
print(my_list_2)
[1, 3, 5, 7, 9, 8, 4, 6, 2, 10]

복사된 리스트 변경해보기

my_list_2[0] = 11
print(my_list_2)
print(my_list)
[11, 3, 5, 7, 9, 8, 4, 6, 2, 10]
[1, 3, 5, 7, 9, 8, 4, 6, 2, 10]

-> .copy()를 통해 복사한 리스트는 다른 id 값을 가지고 있어서 복사본의 변경이 영향을 미치지 않는다

count(x)

리스트가 가지고 있는 x 의 갯수 세기

print(my_list.count(1))
1

extend(iterable)

리스트의 뒤에 iterable한 항목을 추가

my_list.extend(my_list_2)
print(my_list)
[1, 3, 5, 7, 9, 8, 4, 6, 2, 10, 11, 3, 5, 7, 9, 8, 4, 6, 2, 10]

index(x)

입력된 인자의 위치 반환

print(my_list.index(1))
0

insert(x,y)

x자리에 y를 입력해줌

my_list.insert(0,30)
print(my_list)
[30, 1, 3, 5, 7, 9, 8, 4, 6, 2, 10, 11, 3, 5, 7, 9, 8, 4, 6, 2, 10]

pop(x)

입력된 값을 빼줌

my_list.pop(11)
print(my_list)
[30, 1, 3, 5, 7, 9, 8, 4, 6, 2, 10, 3, 5, 7, 9, 8, 4, 6, 2, 10]

()안에 입력을 하지 않으면 마지막 값을 지운다

my_list.pop()
print(my_list)
[30, 1, 3, 5, 7, 9, 8, 4, 6, 2, 10, 3, 5, 7, 9, 8, 4, 6, 2]

remove(x)

입력된 값을 빼줌

my_list.remove(10)
print(my_list)
[30, 1, 3, 5, 7, 9, 8, 4, 6, 2, 3, 5, 7, 9, 8, 4, 6, 2]

값이 없으면 에러를 일으킨다

my_list.remove(100)
print(my_list)
my_list.remove(100)
ValueError: list.remove(x): x not in list

sort()

리스트를 정렬해준다

my_list.sort()
print(my_list)
[1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 30]

리스트가 문자열로 이루어진 경우

my_list_3 = ['1', '2', '3', '5', '10', '11', '12', '22', '33', '34']
my_list_3.sort()
print(my_list_3)
['1', '10', '11', '12', '2', '22', '3', '33', '34', '5']

reverse()

리스트를 뒤집어서 출력해준다

my_list.reverse()
print(my_list)
[30, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1]

clear()

리스트 항목 삭제(리스트 자체를 삭제하는건 아니다)

my_list.clear()
print(my_list)
[]

 

복습복습

반응형
반응형

python으로 369게임 만들어보기

숫자를 입력하면 369 게임 결과가 문자열로 출력되도록 만들어보았다

n = int(input())
game_list = ''
fin = ''

for i in range(1, n+1):
    game_list += (str(i)+' ')
    game = game_list.split(' ')
for i in range(0, n):
    if '3' in game[i] or '6' in game[i] or '9' in game[i]:
        game[i] = '짝'
game.pop(-1)
for i in range(0, n):
    fin += game[i] + ' '
print(fin)

'3' '6' '9'가 문자열에 속하면 짝을 출력하게 만들었다

 

문자열로 출력을 하려고 어찌저찌 하다보니깐 상당히 비효율적인 코드가 만들어졌다.

 

일단 int 로 숫자를 받아서 -> 받은 숫자의 길이만큼 생성되는 리스트를 만들어주고 -> split를 이용해서 만들어진 리스트를 띄어쓰기를 기준으로 문자열로 다시 바꿔준 후 -> 만들어진 리스트를 돌며 '3' '6' '9' 가 속해있다면 짝으로 변경해준다

띄어쓰기를 기준으로 문자열로 바꿔주는 과정에서 공백문자 하나가 리스트에 추가가 되어서 .pop()을 이용해 가장 마지막에 있는 공백 리스트를 제거해 준 후 -> 다시 for 문을 동해 3,6,9가 짝으로 바뀐 문자열을 돌아 문자열에 추가해준다

그리고 문자열 출력

 

 

형변환 과정만 몇번을 거쳐야하는 매우 비효율 적인 코드 완성...

생각해보니... 33 36 39 같이 369가 2개가 중첩되는 구간은 '짝' 이 아니라 '짝짝'이 출력되게 해야하네...

그런식으로 코드를 짜려면 코드를 살짝 수정하는게 아니라 전반적인 풀이 방법을 아예 바꿔야 할 것 같다

 

 

 

반응형
반응형

재귀함수

함수 안에서 자기 자신을 호출하는 함수

오늘의 연습 재귀함수로 팩토리얼 계산하는 함수 만들기 +for문을 활용한 팩토리얼 계산

최종코드

# 재귀함수 연습 01 팩토리얼 계산해보기

# 재귀함수를 이용한 팩토리얼 계산 함수
def fac (num):
    gap = num
    if num <= 1:
        return gap
    else:
        gap = gap * fac(num-1)
        return gap

# 반복문으로 팩토리얼 계산
def fac_for (num):
    gap = 1
    for i in range(num):
        gap += gap * i
    return gap

factorial = int(input())

print(fac(factorial))
print(fac_for(factorial))

일단 재귀함수를 연습하기 좋다는 팩토리얼 계산 법을 만들어봤는데...!

내가 짠 코드대로라면 일단 for문의 코드 줄이 조금 더 짧다!

아직 반복문에 더 익숙해져 있다보니 반복문으로 짜는게 더 쉽기도 하고... 하지만 연습을 위해 재귀함수를 다른 경우에도 사용해서 코드를 만들어봐야할 것 같다

문제에 따라 재귀함수가 더 효율적일 수 있고, 반복문을 사용하는게 더 효율적일 수도 있다

if num <= 1:
return gap

base case

재귀함수에는 반드시 함수를 빠져나갈 수 있는 base case가 존재해야한다 base case가 존재하지 않으면 무한반복에 걸린다...! 여기서 나는

if num <= 1:

    return gap

으로 받은 숫자에서 계속 1씩 작아지며 연산하다가 결국 값이 1이 되는 순간 함수를 빠져나가도록 했다

해당 함수에서 '<'는 필요 없지만 혹시 내가 낼지도 모르는 오류를 대비해서 '<'를 입력해뒀다 <= >= 가 습관이기도 하구,,,ㅎㅎ

반응형

'study > python' 카테고리의 다른 글

python) list append() 와 extend() 비교하기  (0) 2021.08.01
python) list에서 사용할 수 있는 메서드 정리  (0) 2021.08.01
python) 369 게임 만들어보기  (0) 2021.07.29
python) any()함수  (0) 2021.07.26
python) min / max 함수  (0) 2021.07.26
반응형

any() 함수

반복 가능한 자료형의 어느 하나라도 참이면 True를 리턴, 만약 자료형이 비어 있으면 False를 반환한다

 

# 공식문서
def any(iterable):
    for element in iterable:
        if element: #이부분은 자료형이 존재한다는 의미인가부다
            return True
    return False

공식 문서에서 소개하는 any() 함수 내부

if <인자> 인자를 바로 입력하는게 하나하나를 돌며 true false를 확인한다는 의미인가부다 *<>안에 들어오는 단어가 '인자'인지 '파라미터' 인지 아직 잘 구분이 안간다

 

내가 처음 만든 코드

# 내가 만들었던 코드
def my_any(elements):
    if not elements:
        return False
    for i in elements:
        if not i :
            return False
        else:
            return True

공식문서를 참고하기 전 직접 만들었던 my_any 함수

my_list_01 = []
my_list_02 = [1, 2, 3, '4']
my_list_03 = [[], 2, 3, '4']

각각 any 함수와 my_any 함수에 위의 리스트를 입력해주면

any : false / true / true

my_any : false / true / false

값을 반환하는데 이는 my_any함수에서 빈 리스트를 감지하고 false를 반환하고 있다는걸 확인할 수 있었다

사실 생각 안하고 그냥 공식 문서를 이해하고 넘어가는게 빠르기야 하지만 내 코드를 고쳐서 맞는 값이 나오게 해보자

 

최종 코드

def my_any(elements):
    # 이 코드에선 빈 자료형인 경우 none을 반환한다
    if not elements:
        return False
    else:
        return True

꽤 한참

for i in elements:

    if not i:

        return : False

    else:

        return : True

이 문장을 어떻게 고쳐야 할까를 고민했는데

하나라도 참이라면 모두 참이다(or)을 표현하기 위해선 그냥 이 for문을 지우면 된다는걸 멍청하게도 한참 후에 깨닳았다

그래서 최종 코드 따란

 

반응형
반응형

min / max 함수에는 iterable한 자료형이 들어가야 한다

iterable한 자료형 : 리스트, 문자열, 튜플 등

 

max(iterable)

입력 된 값 중 가장 큰 값 반환

 

min(iterable)

입력 된 값 중 가장 작은 값 반환

 

연습

#리스트
x = [1,2,3,4,5,6,7,8,9,10]

print(max(x))
print(min(x))

#문자열
y = '가나다라마바사'

print(max(y))
print(min(y))

#튜플
z = (1,2,3,4,5,6,7,8,9)

print(max(z))
print(min(z))
반응형
반응형

복습용 자료 정리

 

숫자형

- a ** b -> a를 b 만큼 제곱한다

- a % b -> 나눗셈의 나머지 반환 4%3 = 1

- a // b -> 나눗셈의 몫을 반환 10//3 = 3

 

문자열 자료형

\n 문자열 안에서 줄을 바꿈

\t 문자열 안에서 탭 간격을 줌

\\ \를 표현할 때 사용

 

슬라이딩 [0:n] -> 0에서부터 n까지의 자료 처리

[:n] 처음부터 n까지

[n:] n부터 끝까지

 

포맷팅 : 값을 삽입하는 것

 

%s 문자열

%c 문자 1개

%d 정수

%f 부동소수

 

.count() 문자 개수 세기

.find() 문자 위치 찾기 - 문자열 안에 없는 값을 입력 하면 -1 반환

.index() 문자 위치 찾기 - 문자열 안에 없는 값을 입력하면 오류 반환

.join() 문자열 삽입

.upper() 소문자를 대문자로

.lower() 대문자를 소문자로

.strip() 공백 지우기 - 왼쪽 공백만 지울 때는 앞에 l 추가, 오른쪽 공백만 지울 경우 앞에 r 추가

.replace( , ) 문자열 바꾸기

.split() 문자열 나누기

 

리스트 자료형

리스트명 = [요소1, 요소2, 요소3]

 

len(리스트명 ) 리스트 길이 구하기

 

리스트.append(값) -> 리스트 마지막에 값 추가

리스트.sort() -> 리스트를 순서대로 정리

리스트.reverse() -> 리스트 순서 뒤집기

리스트.endex(값) -> 값의 위치값 반환

리스트.insert(위치, 값) -> 값을 위치에 저장

리스트.remove(값) -> 값에 해당하는 요소 제거

리스트.pop(값) -> 값에 해당하는 값 반환

리스트.count(값) -> 값에 해당하는 요소가 몇개 있는지 반환

리스트.extend(리스트) -> 리스트를 더한다

 

튜플 자료형

 

튜플명 = (요소1,요소2,요소3)

 

튜플 자료는 값을 바꿀 수 없다

 

 

딕셔너리 자료형

 

{Key1:Value1,Key2:Value2,Key3:Value3}

 

Key에 리스트는 쓸 수 없으나 튜플은 가능하다 -> 튜플은 바뀔 수 없는 값이고 리스트는 바뀔 가능성이 있는 값이라서

 

.key() -> Key 리스트 만들기

.values() -> Values 리스트 만들기

.item() -> Key, Values 쌍 얻기

.clear -> Key, Values 쌍 지우기

.get(key) -> key에 해당하는 values 얻기

요소 in 딕셔너리 -> 요소가 딕셔너리에 있는지 조사하기

 

집합 자료형

set() 키워드를 통해 만들 수 있다

- 중복을 허용하지 않는다

- 순서가 없다

 

리스트나 튜플 자료형은 순서가 존재하기 때문에 인덱싱(ex) a[0])을 통해 값을 얻을 수 있지만 set 자료형은 순서가 없어 인덱싱으로 값을 얻지 못한다

 

교집합 : & , intersection

합집합 : | , union

차집합 : - , difference

갑 하나 추가 : .add

값 여러개 추가 : .update

특정 값 제거 : .remove

불(bool) 자료형

참 거짓을 나타내는 자료형

변수

익숙한 영역이라 가볍게 넘어가기

 


나름 쉽다고 생각했는데 생각보다 외워야 하는게 많아서 연습문제를 풀 때 책 앞쪽을 뒤적거려야했다.

반응형
반응형

9등급 꼴찌 1년만에 통역사 된 비법을 읽고 첫번째로 100LS를 시도하는 영화

"캐치 미 이프 유 캔"

100LS에 도전하기 위해서 문화와 단절된 삶을 사는 편이였던 나는 이번 기회에 넷플릭스에도 가입했다

 

다시 돌아보는 100LS 실행 5단계


1단계 _ 자막 없이 그냥 보기

2단계 _ 한국어 자막으로 이해하기

3단계 _ 영어 자막으로 보되, 들리지 않는 구간의 대사 받아 적기

4단계 _ 들리지 않는 구간, 반복해서 듣고 말하기

5단계 _ 자막 없이 97번 영화 보기


캐치 미 이프 유 캔을 처음 선택한 이유는 영화를 잘 보지 않는 나에게는 '좋아하는 영화', '볼만한 영화'의 기준이 없는 편인데 그나마 페이스북에서 짧게 클립 영상으로 드문드문 본 기억이 있어서

'아 이번 기회에 이 영화가 무슨 내용인지 함 보자!' 하는 마음으로 선택했다 + 디카프리오가 잘생겼다

 

100LS를 시작한지 5일차로 지금 3단계까지 완료했다

 

1단계 _ 자막 없이 그냥 보기

캐치 미 이프 유 캔을 처음 재생하며 '아 그래도 페이스북에서 짧게 여러 장면을 봤으니깐 대충 스토리를 파악하는데는 무리가 없겠지?' 라고 생각했는데 생각보다 너무 힘들었다

자막 없이 그냥 보니깐 중간중간 무슨 대화를 나누는지 이해하기 어려웠고 영화속 속삭이는 듯한 대화를 종종 나누는데 정말 하나도 못알아듣겠고 사람들의 대화가 아니라 표정에만 의지를 하고 영화 스토리를 이해하려 들다보니 아예 다른 느낌으로 해석해버린 장면도 꽤 많았다

영화 자체를 계속 보는게 힘이 들고 이 영화의 러닝타임도 2시간 반 정도로 긴 편이라 그냥 영화 한편 본다는 생각으로 편하게 보려고 했지만 결국 중간에 한번 끊고 2번에 나눠서 봐야했다

 

2단계 _ 한국어 자막으로 이해하기

한국어 자막으로 보니 너무 수월했다

한번 스토리를 훑어보았지만 이해 안가는 부분이 많아서 그런지 인물의 대화 하나하나에 집중하기보단 그냥 스토리에 몸을 맡기고 흘러가는대로 보았다 영화가 참 재미있더라 중간중간 유머요소가 많았다

내가 젤 웃겼던 장면은 호텔에서 칼이 에버그네일을 놓치고 사무실로 돌아왔을 때 조수 둘이 아이스크림을 먹고 있는 장면! 자막 없이 봤을때는 아이스크림을 먹는다는 것 자체를 인식 못했었는데 자막에서 망을 보면 아이스크림을 사주겠다는 대화가 나오고 화면이 전환되면서 아이스크림을 먹고 있는게 너무 귀여웠고 대사 하나만으로 이렇게까지 다르게 보일 일인가 싶었다

말로써 전해지는 유머요소를 화면으로도 못보고 지나쳤다는게 신기했다

그리고 바에서 아빠와 만나서 대화하는 장면에서 나는 아빠가 FBI를 언급하면서 디카프리오의 표정이 급격하게 나빠지길래 추적에 대한 두려움인가 했는데 막상 자막 보니 엄마에 대한 이야기였다. 완전 헛다리...

 

3단계 _ 영어 자막으로 보되, 들리지 않는 구간의 대사 받아 적기

 

안들리는 부분이 정말 말 그대로 안들리는인지 해석이 안되는 인지 모르겠어서 그냥 해석좀 안된다 안들린다 싶으면 다 받아적었더니 대본집이 된 것 같다

what's your name, How are you 같은거 빼고 다 적었다 총 25페이지!

책을 읽으면서 모르는 단어를 바로 바로 찾으라고 했었는지 일단 적어서 계속 보다 영 모르겠으면 자막을 켜서 확인하라고 했는지 기억이 안나서 일단 적기만 하고 영 첨보는 단어다 싶은것만 적어두었다

그래도 고등교육을 받았고 영화에서 나오는 단어들이 법, 의학 관련 단어 말고는 특별히 어려운게 없었는데 그럼에도 불구하고 단어들의 조합을 해석하지 못한다는게 자괴감이 들었다.

영화 대사를 하나하나 받아적다보니 시간도 많이 걸렸고... 이것도 영어 공부라곤 하지만 4학년 토익 점수가 당장 필요한 나는 토익 공부도 따로 하긴 해야하는데 대본 적는데 시간이 너무 많이 걸려서 아...정말 괜찮을까 하는 생각도 들구,,,

 

영어 대본을 하나하나 적으면서 종종 아 진짜 짜증난다 싶을정도로 무슨 말인지 모르겠는 부분만 듬성듬성 한국어 자막을 틀어 확인해봤는데 영어 해석과 한국어 자막이 많이 다르기도 하더라

어디선가 영화의 자막은 해석도 해석이지만 영화를 보는데 집중해야하기 때문에 해석을 많이 생략한다는 글을 본 적이 있는데 정말로 짧게 해석된것들이 많았다

약혼식날 도망가면서 한국어 자막에서는 자신의 실제 나이는 안 밝히고 도망갔는데 영어로 보니깐 겨우 16에 집을 나온지 1년 반 된 아이라고 나이를 밝히는 장면이 나오더라...! 같은 영화 3번 봤는데 다 내용이 살짝 살짝 다른 것 같은게 꼭 다른 영화를 3편 본 것 같다

아 그리고 두번째로 봤을때 아이스크림 장면 너무 재미있게 봤는데 막상 영어 자막으로 보니깐 아이스크림에 대한 언급이 없어서 몇번 다시 봐야했다. 아마 미국에서는 유명한 상표를 우리는 못알아들으니깐 그냥 아이스크림이라고 번역했나보다

냉동케이크도 sara lee라고만 나올 뿐...

 

 

3단계 까지 진행한 결과

 

: 100번중에 겨우 3번 봤으니 당연히 확신이 없는것은 당연하다고 생각한다 하지만 조금 아쉬운게 있다면 아무것도 모르고 처음 시작하는건데 러닝타임이 너무 긴 영화를 고른 것 같다는 점... 혹시 이 블로그를 읽게 되는 사람이 있다면... 처음엔 잘 모르니깐 러닝타임이 짧은 영화로 선택해서 시작하는게 좋을 것 같아요...

2시간 반짜리 영화를 97번 더 볼 생각하니깐... 아이구 내 청춘이야... 디카프리오 얼굴에 주름까지 외우게 생겼구만

반응형

+ Recent posts