10 장리스트 박창이 서울시립대학교통계학과 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 1 / 32
학습내용 리스트가변성 (mutability) 가로지르기 (traversing) 연산부분추출메소드 (method) 맵, 필터, 리듀스 (map, filter, and reduce) 원소제거하기 (deleting element) 리스트와문자열객체와값별명 (aliasing) 리스트인자 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 2 / 32
리스트 리스트는원소 (element) 또는품목 (item) 이라불리는값들의열이며문자열과달리타입에제한이없음 리스트내에리스트가중첩 (nest) 될수있으며원소들의타입이서로다를수있음 >>> cheeses = [ Cheddar, Edam, Gouda ] >>> numbers = [17, 123] >>> empty = [] >>> print(cheeses, numbers, empty) [ Cheddar, Edam, Gouda ] [17, 123] [] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 3 / 32
가변성 리스트는문자열과는달리변경이쉬움 (mutable) >>> numbers = [17, 123] >>> numbers[1] = 5 >>> print(numbers) [17, 5] 인덱스에대한규칙 정수값은인덱스로사용가능존재하지않는원소에접근하는경우 IndexError 발생음수값의인덱스는리스트의끝에서부터거꾸로셈 >>> Edam in cheeses True >>> Brie in cheeses False 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 4 / 32
가로지르기 I 읽기만하는경우인덱스필요하지않지만변경시인덱스필요 >>> for cheese in cheeses: print(cheese) Cheddar Edam Gouda >>> for i in range(len(numbers)): numbers[i] = numbers[i] * 2 >>> print(numbers) [34, 10] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 5 / 32
가로지르기 II 빈리스트에서는루프작동안함 >>> for x in []: print( This never happens. ) 중첩된리스트도원소로간주됨 >>> x = [ spam, 1, [ Brie, Roquefort, Pol le Veq ], [1, 2, 3]] >>> x[2] [ Brie, Roquefort, Pol le Veq ] >>> len(x) 4 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 6 / 32
연산 + 는두리스트를연결 >>> a = [1, 2, 3] >>> b = [4, 5, 6] >>> c = a + b >>> print(c) [1, 2, 3, 4, 5, 6] * 는주어진횟수만큼리스트를반복 >>> [0] * 4 [0, 0, 0, 0] >>> [1, 2, 3] * 3 [1, 2, 3, 1, 2, 3, 1, 2, 3] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 7 / 32
부분추출 문자열처럼부분추출사용가능 >>> t = [ a, b, c, d, e, f ] >>> t[1:3] [ b, c ] >>> t[:4] [ a, b, c, d ] >>> t[3:] [ d, e, f ] >>> t[:] [ a, b, c, d, e, f ] 문자열과는달리원소변경이가능 >>> t[1:3] = [ x, y ] >>> print(t) [ a, x, y, d, e, f ] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 8 / 32
리스트메소드 I append 는새원소를리스트끝에붙임 >>> t = [ a, b, c ] >>> t.append( d ) >>> print(t) [ a, b, c, d ] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 9 / 32
리스트메소드 II extend 는리스트를인자로받아모든원소를붙일수있고 insert 는해당인덱스에추가 >>> t1 = [ a, b, c ] >>> t2 = [ d, e ] >>> t1.extend(t2) >>> print(t1) [ a, b, c, d, e ] >>> t2.insert(3, f ) >>> print(t2) [ d, e, f ] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 10 / 32
리스트메소드 III remove 는리스트에서해당원소를제거하며 index 는원소의인덱스값반환 >>> t = [ a, b, c ] >>> t.remove( b ) >>> print(t) [ a, c ] >>> t.index( a ) 0 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 11 / 32
리스트메소드 IV sort 는리스트의원소를정렬하고 reverse 는역순으로함 >>> t = [ d, c, e, b, a ] >>> t.sort() >>> print(t) [ a, b, c, d, e ] >>> t.reverse() >>> t [ e, d, c, b, a ] 리스트메소드는반환값이없음 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 12 / 32
맵, 필터, 리듀스 I 리스트의숫자들의합 def add_all(t): total = 0 for x in t: total += x return total total += x 는 total = total + x 와동치 원소들의열을하나의값으로만드는연산을 reduce 라고함 >>> t = [1, 2, 3] >>> sum(t) 6 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 13 / 32
맵, 필터, 리듀스 II 문자열을대문자로변환하여뒤에붙임 def capitalize_all(t): res = [] for s in t: res.append(s.capitalize()) return res 메소드 (capitalize) 를열의원소각각에매핑시키므로 map 이라불림 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 14 / 32
맵, 필터, 리듀스 III 문자열을입력받아대문자로이루어진문자열만반환 def only_upper(t): res = [] for s in t: if s.isupper(): res.append(s) return res 일부의원소만을선택하고나머지는걸르는것을필터라함 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 15 / 32
맵, 필터, 리듀스 IV 대부분의리스트연산은맵, 필터, 리듀스의결합으로표현됨 Python 에서는내장함수 map 과 list comprehension 이라불리는연산등의기능을제공함 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 16 / 32
원소제거하기 I 리스트에서제거할원소의인덱스를알고제거된원소값이필요한경우 pop 을사용. 인덱스를주지않으면마지막원소를지우고그값을반환함 >>> t = [ a, b, c ] >>> x = t.pop(1) >>> print(t) [ a, c ] >>> print(x) b 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 17 / 32
원소제거하기 II 제거된원소가필요하지않고제거할원소의인덱스를알면 del 을사용하고, 인덱스대신제거할값을아는경우 remove 를사용 >>> t = [ a, b, c ] >>> del t[1] >>> print(t) [ a, c ] >>> t = [ a, b, c ] >>> x = t.remove( b ) >>> print(t) [ a, c ] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 18 / 32
원소제거하기 III 여러원소들을제거할때 >>> t = [ a, b, c, d, e, f ] >>> del t[1:5] >>> print(t) [ a, f ] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 19 / 32
리스트와문자열 I 문자들의리스트는문자열은아님 문자열을리스트로변환하려면 list 사용 >>> s = spam >>> t = list(s) >>> print(t) [ s, p, a, m ] 문자열을단어로쪼개기위해 split 사용 >>> s = printing for the fjords >>> t = s.split() >>> print(t) [ printing, for, the, fjords ] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 20 / 32
리스트와문자열 II delimiter 는단어의경계지정 >>> s = spam-spam-spam >>> delimiter = - >>> s.split(delimiter) [ spam, spam, spam ] join 은문자열을연결 >>> t = [ pining, for, the, fjords ] >>> delimiter = >>> delimiter.join(t) pining for the fjords 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 21 / 32
객체와값 is 연산자를이용하여두변수가동일한객체를가리키는지확인 >>> a = banana >>> b = banana >>> a is b True 리스트의경우 >>> a = [1, 2, 3] >>> b = [1, 2, 3] >>> a is b False 두리스트 a 와 b 는동등 (equivalent) 하지만동일 (identical) 하지는않음 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 22 / 32
별명 변수를객체와연관시키는것을참조 (reference) 라하며예에서는동일한객체에두참조가있음 >>> a = [1, 2, 3] >>> b = a >>> b is a True 이처럼둘이상의참조가있는객체는두이름이있고이러한객체를별명이있다고함 객체가변경가능한경우에러가생기기쉬워바람직하지않음 >>> b[0] = 17 >>> print(a) [17, 2, 3] 문자열처럼변경이불가능한경우에는큰상관이없음 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 23 / 32
리스트인자 I 리스트의첫원소를제거하는함수 >>> def delete_head(t): del t[0] >>> letters = [ a, b, c ] >>> delete_head(letters) >>> print(letters) [ b, c ] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 24 / 32
리스트인자 II 리스트를수정하는연산과새로운리스트를생성하는연산을구별해야함. append 는기존의리스트를수정하며 + 연산자는새로운리스트생성 >>> t1 = [1, 2] >>> t2 = t1.append(3) >>> print(t1) [1, 2, 3] >>> print(t2) None >>> t3 = t1 + [4] >>> print(t3) [1, 2, 3, 4] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 25 / 32
리스트인자 III 리스트를수정하지않는경우 >>> def bad_delete_head(t): t = t[1:] 부분추출은새로운리스트를생성하며파라미터 t 가참조하는원래의객체를건드리지않음. 대안으로다음을고려할수있음. 마찬가지로원래의리스트를변경하지는않음 >>> def tail(t): return t[1:] >>> letters = [ a, b, c ] >>> rest = tail(letters) >>> print(rest) [ b, c ] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 26 / 32
디버깅 I 문자열메소드의경우원본은놔두고새로운문자열을주는반면대부분의리스트메소드는인자로주어진리스트를변경하고 None 을반환함 word = word.strip() # OK(word: string) t = t.sort() # wrong(t: list) 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 27 / 32
디버깅 II t 는리스트이고 x 는리스트원소일때다음은옳지만 t.append(x) t = t + [x] 다음은틀림 t.append([x]) t = t.append(x) t + [x] t = t + x 마지막문장만실행오류가발생 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 28 / 32
디버깅 III 원본을유지하고싶은경우원리스트의복사본생성 orig = t[:] t.sort() 혹은 sorted 함수를이용하면원리스트는놔두고정렬된새리스트를생성 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 29 / 32
예제 I >>> x = range(10) >>> print(x[0]) 0 >>> print(x[1]) 1 >>> print(x[-1]) 9 >>> print(x[-2]) 8 >>> print(x[:3]) range(0, 3) >>> print(x[3:]) range(3, 10) 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 30 / 32
예제 II >>> print(x[1:5]) range(1, 5) >>> print(x[-3:]) range(7, 10) >>> print(x[1:-1]) range(1, 9) >>> 1 in [1,2,3] True >>> 0 in [1,2,3] False >>> x = [1,2,3] >>> x.extend([4,5,6]) >>> print(x) [1, 2, 3, 4, 5, 6] >>> x = [1,2,3] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 31 / 32
예제 III >>> y = x + [4,5,6] >>> print(x, y) [1, 2, 3] [1, 2, 3, 4, 5, 6] >>> x.append(0) >>> print(x) [1, 2, 3, 0] 박창이 ( 서울시립대학교통계학과 ) 10 장리스트 32 / 32