-
[CHAPTER 7] 리스트, 튜플Deep Learning/인공지능 입문 코딩 2021. 5. 23. 23:23728x90
데이터 여러 개를 하나로 묶어서 저장하는 방법을 배워보자.
리스트(list)
리스트(list)는 파이썬에서 여러 개의 데이터를 하나로 묶어서 저장하는 방법들 중 하나다.
대괄호를 이용해서 만들 수 있다.
리스트(list) 사용법
그룹 BTS의 멤버 3명을 리스트에 저장한다.
>>> bts = ['V', 'Junkook', 'Jimin'] >>> bts ['V', 'Junkook', 'Jimin']
append 메서드를 이용하여 리스트에 요소를 추가할 수 있다.
>>> bts = ['V', 'Junkook', 'Jimin'] >>> bts.append('RM') >>> bts ['V', 'Junkook', 'Jimin', 'RM']
list() 함수를이용해 list로 변환할 수도 있다.
>>> data = range(5) >>> data_list = list(data)
>>> type(data) <class 'range'>
>>> type(data_list) <class 'list'>
리스트를 리스트안에 포함시켜서 만든것이 이차원 리스트이다.
이차원 리스트
>>> slist2 = [ ['Kim', 178.9], ['Park', 173.5], ['Lee', 176.1] ] >>> slist2 [['Kim', 178.9], ['Park', 173.5], ['Lee', 176.1]]
인덱싱
리스트 내의 원소를 찾아가기 위해서는 인덱싱을 사용하는데 아래와 같이 한다.
>>> bts = ['V', 'Junkook', 'Jimin'] >>> bts[0] # 첫 번째 요소에 접근 'V' >>> bts[1] # 두 번째 요소에 접근 'Junkook' >>> bts[2] # 세 번째 요소에 접근 'Jimin'
1,2,3,4...으로 읽지 않고
0,1,2,3,4...으로 읽는다.
이차원 리스트 인덱싱은 다음과같이 한다.
>>> slist2 = [ ['Kim', 178.9], ['Park', 173.5], ['Lee', 176.1] ] >>> slist2[0][0] 'Kim'
>>> slist2[0][1] 178.9
리스트에 대해서 연산하는 방법들을 살펴보자.
리스트 연산
+ 연산자를 이용하여 두 개의 리스트를 합칠 수 있다.
>>> bts = ['V', 'J-Hope'] + ['RM', 'Jungkook', 'Jin'] >>> bts ['V', 'J-Hope', 'RM', 'Jungkook', 'Jin']
정수에 대하여 + 연산을 한다고해서 원소끼리 더해지는 것은 아니다.
문자열을 저장한 리스트에 대하여 + 연산을 할 때와 마찬가지로 리스트가 합쳐진다.
>>> numbers1 = [10, 20, 30] >>> numbers2 = [40, 50, 60] >>> numbers1 + numbers2 [10, 20, 30, 40, 50, 60]
*연산은 n을 곱하면 리스트가 n번 반복되면서 늘어난다.
>>> num_list = [0, 1, 2] >>> num_list * 3 [0, 1, 2, 0, 1, 2, 0, 1, 2]
in 연산자는 리스트에 어떤 값이 포함되어 있는지 알아낼 때 사용한다.
>>> 'V' in bts True >>> 'V' not in bts False
리스트 활용
리스트에 사용가능한 함수
>>> n_list = [200, 700, 500, 300, 400] >>> len(n_list) # 리스트의 길이를 반환 5 >>> max(n_list) # 리스트중 가장 큰 값을 반환 700 >>> min(n_list) # 리스트중 가장 작은 값은 반환 200 >>> sum(n_list) # 리스트의 합을 반환 2100 >>> list(range(1,11)) # 1부터 10까지의 수를 생성하여 리스트로 변환 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
any()는 리스트에 0이아닌 원소가 하나라도 있을 경우 True를 반환한다.
>>> n_list = [200, 700, 500, 300, 400] >>> a_list = [0, ''] >>> any(n_list) True >>> any(a_list) False
n_list는 0이아닌 원소가 하나라도 있으므로 True
a_list는 0이 아닌 원소가 없으므로 False이다. 여기서 ''(비어있는 문자열)은 0으로 취급한다.
슬라이싱(slicing)
리스트에서 여러 요소를 선택해서 새로운 리스트를 만들고 싶다면, 슬라이싱(slicing) 기능을 사용하자.
슬라이싱을 하면 원래의 리스트는 손상되지 않는다.
인덱스 2부터 5가 되기 전까지 1칸씩 건너뛰며 추출하라는 의미이다.
>>> letters = ['A', 'B', 'C', 'D', 'E', 'F'] >>> letters[2:5:1] ['C', 'D', 'E']
모든 값들은 생략 가능하다.
생략 하였을때 첫 번째 값은 0, 세 번째 값은 1로 대체된다.
두 번째 값을 생략하면 리스트의 끝까지라고 가정한다.
>>> letters[::] ['A', 'B', 'C', 'D', 'E', 'F']
2칸씩 건너뛰어 읽어오는 코드이다.>>> letters[::2] ['A', 'C', 'E']
음수 값을 쓸 수도 있다.
인덱스 값은 아래와 같이 읽는다.
인덱스 0부터 -1까지 읽어오는 코드이다.
>>> letters[:-1:] ['A', 'B', 'C', 'D', 'E']
세 번째 값에 음수를 쓴다면 뒤에서부터 앞으로 읽어온다.
>>> letters[::-1] ['F', 'E', 'D', 'C', 'B', 'A']
리스트 수정
리스트를 수정해보자.
인덱싱을 이용하여 접근한 뒤덮어쓰면 된다.
>>> slist = ['Kim', 178.9, 'Park', 173.5, 'Lee', 176.1] >>> slist[3] = 175.0 >>> slist
슬라이싱을 이용하여 수정할 수도있다.
>>> slist[2:4] = ['Paik', 180.0] >>> slist ['Kim', 178.9, 'Paik', 180.0, 'Lee', 176.1]
insert()는 리스트의 원하는 인덱스에 추가하는 함수이다.
insert()
>>> slist.insert(4, "Hong") >>> slist.insert(5, 168.1) >>> slist ['Kim', 178.9, 'Paik', 180.0, 'Hong', 168.1, 'Lee', 176.1]
리스트의 원소를 삭제해보자.
remove()
>>> slist.remove('Kim') >>> slist.remove(178.9) >>> slist ['Paik', 180.0, 'Hong', 168.1, 'Lee', 176.1]
마지막 원소를 삭제하고, 삭제한 값을 반환한다.
pop()
>>> slist.pop() 176.1 >>> slist.pop() 'Lee' >>> slist
오름차순 정렬을 해준다.
sort()
revers=True를 인자로 전달해주면 내림차순 정렬을 해준다.
>>> numbers = [ 9, 6, 7, 1, 8, 4, 5, 3, 2 ] >>> numbers.sort() >>> print(numbers) [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> numbers = [ 9, 6, 7, 1, 8, 4, 5, 3, 2 ] >>> numbers.sort(reverse=True) >>> print(numbers) [9, 8, 7, 6, 5, 4, 3, 2, 1]
정렬하여 새로운 list를 만들고 싶다면 sorted()를 이용한다.
>>> numbers = [ 9, 6, 7, 1, 8, 4, 5, 3, 2 ] >>> new_list = sorted(numbers, reverse=True) >>> print(new_list)
리스트 메서드 정리
메소드 하는 일 index(x) 원소 x를 이용하여 위치를 찾는 기능 append(x) 원소 x를 리스트의 끝에 추가한다. count(x) 리스트 내에서 x원소의 개수를 반환 extend([x1,x2]) [x1, x2] 리스트를 기존 리스트에 삽입한다. insert(index, x) 원하는 index 위치에 x를 추가한다. remove(x) x 원소를 리스트에서 삭제한다. pop(index) index 위치의 원소를 삭제한 후 반환한다. 이때 index는 생략될 수 있으며 이 경우 리스트의 마지막 원소를 삭제하고 이를 반환한다. sort() 값을 오름차순 순서대로 정렬한다. 키워드 인자 revers=True 이면 내림차순으로 정렬한다. reverse() 리스트를 원래 원소들의 역순으로 만들어준다. 리스트 복사
아래 코드의 결과를 예측해보자.
alist = ['Kim', 'Park', 'Lee', 'Hong'] blist = alist blist[1] = 'Choi' # blist의 두번째 항목값을 변경함 print(alist) ['Kim', 'Choi', 'Lee', 'Hong']
blist [1]의 값을 수정했는데 alist [1]의 값도 수정되었다.alist = ['Kim', 'Park', 'Lee', 'Hong']
list객체가 만들어지고 그 객체를 alist가 참조한다.
blist = alist
alist가 참조하는 객체를 blist도 참조한다.
그래서 blist를 수정하였는데 alist의 값이 바뀐 것이다.
>>> id(alist) 2650767759616 >>> id(blist) 2650767759616
id를 조회해 보면 같은 것을 알 수 있다.
그렇다면 리스트를 어떻게 복사할까?
list() 함수를 이용해야 한다.
alist = ['Kim', 'Park', 'Lee', 'Hong'] blist = list(alist) blist[1] = 'Choi' print(alist) ['Kim', 'Park', 'Lee', 'Hong']
새로운 list 객체가 만들어지며 새로운 list를 blist가 참조한다.blist = list(alist)
blist [1] = 'Choi'
alist, blist는 서로 다른 객체를 참조하고 있으므로 alist의 값은 그대로이다.
반복문을 이용한 리스트 탐색
반복문을 이용하여 리스트를 탐색할 수 있다.
>>> bts = ["V", "J-Hope", "Suga", "Jungkook" ] >>> for member in bts: print(member) V J-Hope Suga Jungkook
리스트 함축이라는 기능을 사용해보자.
>>> [ x**2 for x in [1, 2, 3, 4, 5] ] [1, 4, 9, 16, 25]
꺼내온 x값에 x**2 연산을 한 결과들을 리스트로 만든다.리스트 [1, 2, 3, 4, 5]에서 차례대로 x에 꺼내온다.
리스트 함축을 사용한 몇 가지 예시이다.
>>> [x for x in range(10)]# 0에서 9까지 숫자를 포함하는 리스트 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> st = 'Hello World' >>> [x.upper() for x in st] # 문자열 각각에 대해 upper() 메소드 적용 ['H', 'E', 'L', 'L', 'O', ' ', 'W', 'O', 'R', 'L', 'D']
조건이 붙을 수도 있다.
>>> [x for x in range(10) if x % 2 == 0] [0, 2, 4, 6, 8]
split()은 문자열을 공백 단위로 잘라주는 함수이다.
isdigit()은 문자열이 숫자로만 이루어져 있는지 검사하는 함수이다.
>>> [int(x) for x in input('정수를 여러개 입력하세요 : ').split() if x.isdigit()] 정수를 여러개 입력하세요 : 100 이백 300 400 [100, 300, 400]
이중 루프를 쓸 수도 있다.
>>> [(x, y) for x in [1, 2, 3] for y in [3, 1, 4]] [(1, 3), (1, 1), (1, 4), (2, 3), (2, 1), (2, 4), (3, 3), (3, 1), (3, 4)]
괄호로 표시된 것이 튜플 자료형인데 튜플에 대하여 알아보자.
튜플
튜플은 리스트와 유사한 자료형이다.
튜플은 불변, 리스트는 가변이라는 차이가 있다.
튜플은 값을 변경할 수 없다.
>>> t1 = (1, 2, 3, 4, 5) >>> t1[0] = 100 Traceback (most recent call last): File "<pyshell#155>", line 1, in <module> t1[0] = 100 TypeError: 'tuple' object does not support item assignment
인덱싱, 슬라이싱, 결합 연산 모두 리스트와 동일하다
>>> t1 = (1, 2, 3, 4, 5) >>> t1[0] # 튜플의 인덱싱-리스트 인덱싱과 동일한 방식 1 >>> t1[1:4] # 튜플의 슬라이싱 결과로 튜플을 반환함 (2, 3, 4) >>> t2 = t1 + t1 # 튜플의 결합 연산 >>> t2 (1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
클래스(class)와 객체
파이썬은 객체지향 프로그래밍 언어이다.
객체지향 프로그래밍은 다양한 객체를 클래스(class)로 미리 정의해두고 이 객체들이 프로그램 상에서 상호작용하면서 원하는 작업을 수행하는 문제 해결 방식이다.
자료형, 함수, 모듈은 모두 객체이다.
>>> animals = ['lion', 'tiger', 'cat', 'dog'] >>> animals.sort() # animals 리스트의 내부 문자열을 알파벳 순으로 정렬한다 >>> animals ['cat', 'dog', 'lion', 'tiger'] >>> animals.append('rabbit') # animals 리스트에 새 원소를 추가한다 >>> animals ['cat', 'dog', 'lion', 'tiger', 'rabbit'] >>> animals.reverse() # animals 리스트를 원래 원소의 역순으로 재배열한다 >>> animals ['rabbit', 'tiger', 'lion', 'dog', 'cat']
'lion', 'tiger', 'cat', 'dog'의 문자열 항목들을 속성으로 집어넣어 animals라는 리스트 클래스의 인스턴스 객체를 만들었다.
리스트 클래스에는 sort(), append(), remove(), reverse(), pop() 등의 기능을 구현해 두었는데, 리스트 클래스에 속하는 모든 객체들이 이 기능을 사용할 수 있다.
이 기능을 메서드(method)라고 한다.
지금까지 배운 것들로
오늘의 명언을 골라주는 프로그램
import random quotes = [] quotes.append("꿈을 지녀라. 그러면 어려운 현실을 이길 수 있다.") quotes.append("분노는 바보들의 가슴속에서만 살아간다..") quotes.append("고생 없이 얻을 수 있는 진실로 귀중한 것은 하나도 없다.") quotes.append("사람은 사랑할 때 누구나 시인이 된다.") quotes.append("시작이 반이다.") print("############################") print("# 오늘의 명언 #") print("############################") print("") dailyQuote = random.choice(quotes) print(dailyQuote)
############################
# 오늘의 명언 #
############################
시작이 반이다.뱀행렬 만들기
뱀의 몸통처럼 값이 증가하는 이차원 배열을 출력하는 뱀행렬 만들기.
이 행렬의 특징은 n이 5일때 5x5크기의 2차원 배열을 생성하는데 이때 홀수 번째 행이 숫자가 증가하는 방향이 될 경우 짝수 번째 행은 숫자가 감소하는 형태를 가지는 특징이 있다.
n = int(input("n을 입력하시오: ")) num = 0 arr = [[col+row*n for col in range(1, (n+1))] for row in range(n)] for i in range(0, n): if i % 2 == 1: print(arr[i][::-1], end=" ") else: print(arr[i][::1], end=" ") print()
n을 입력하시오: 6
[1, 2, 3, 4, 5, 6]
[12, 11, 10, 9, 8, 7]
[13, 14, 15, 16, 17, 18]
[24, 23, 22, 21, 20, 19]
[25, 26, 27, 28, 29, 30]
[36, 35, 34, 33, 32, 31]728x90'Deep Learning > 인공지능 입문 코딩' 카테고리의 다른 글
[CHAPTER 9] 텍스트 처리 (0) 2021.05.29 [CHAPTER 8] 딕셔너리와 집합 (0) 2021.05.24 [CHAPTER 6] 함수 (0) 2021.05.22 [CHAPTER 5] 반복문 (0) 2021.05.21 [CHAPTER 4] 조건문 (0) 2021.05.16