지금까지의 수업을 통해서 정수, 실수, 문자열을 다루는 법을 배웠다.
만약 프로그램에서 복수의 정수, 실수, 문자열을 다룰 필요가 있다면 어떻해야 할까?
이런 용도를 위하여 Python 언어는 리스트를 제공하고 있으며, 특히 서로 다른 타입의 값과 변수를 함께 다루면서 읽고/쓸수 있다는 장점을 제공한다.
리스트(List)
도 정수, 실수, 문자열과 같은 Python의 기본 내장형 타입입니다.
리스트는 다음과 같이 서로 다른 타입이면서도 복수의 값들을 '읽고 쓸수' 있는 Python의 내장 데이터 타입입니다.
course
는 "Python"과 "C++"인 두개의 문자열을 저장하는 리스트이며, level
은 1과 2의 두개 정수를 저장하는 리스트입니다.
복수의 값을 가지고 있으므로, 각각의 값에 접근하는 문법이 필요한데, 이미 문자열에서 배운 []
문법을 사용합니다.
예제에서 처럼 course
리스트의 0
번째(첫번째) 아이템(element)
에 접근하고 싶으면, course[0]
과 같이 하여 값을 읽고 쓸수 있습니다.
만약에 [n]
의 n
에 음의 값(minus index
)을 주면 어떻게 될까요? 문자열에서의 동작과 동일하니 헷갈리면 다시 한번 문자열의 해당 내용을 읽어 봅니다.
course = [ "Python", "Javascript", "C++", "__reserved__" ]
level = [ 1, 2 ]
print(course)
print(level)
print(course[0])
print(level[1])
print(course[-2])
아래의 입력창에 위의 구문을 실행해서 직접 동작을 확인해 봅니다.
course = [ "Python", "Javascript", "C++", "__reserved__" ]
level = [ 1, 2 ]
print(course)
print(level)
print(course[0])
print(level[1])
print(course[-2])
['Python', 'Javascript', 'C++', '__reserved__'] [1, 2] Python 2 C++
리스트에 속한 아이템(element)의 타입은, 각 아이템이 어떤 타입을 가지고 있는지에 따라 결정됩니다.
위의 예제에서 course[0]
와 course[1]
은 문자열임을 눈으로 알수있고, level[0]
와 level[1]
도 정수임을 알수 있습니다.
따라서 각각의 아이템에 대해서 해당 아이템의 속성에 맞는 작업을 하는 것은 언제나 가능합니다.
즉 문자열 아이템에 대해서는 문자열 기능을, 정수/실수 아이템에 대해서는 정수/실수에 대한 계산 등의 기능을 배운대로 적용하는 것은 당연하게 가능합니다.
실제 type()
함수를 실행하여, 리스트 자체 및 리스트 내에 포함된 각 아이템의 타입을, 직접 아래의 입력창에서 확인해 보도록 합니다.
print(type(course))
print(type(course[0]))
print(type(course[1]))
print(type(level))
print(type(level[1]))
<class 'list'> <class 'str'> <class 'str'> <class 'list'> <class 'int'>
리스트에는 서로 다른 타입의 데이터를 섞어서 저장할 수 있습니다.
아래의 예제는 앞에서의 course와 level의 값을 모두 함께 하나의 리스트에 저장한 예제입니다.
일반적으로 리스트에는 동일한 타입의 데이터를 저장하지만, 필요시 서로 다른 타입의 데이터를 혼용하여 저장할 수 있도록 기억하기 바랍니다.
temp = [ "Python", "Javascript", "C++", "__reserved__", 1, 2 ]
print(temp)
print(temp[0])
아래의 입력창에 위의 구문을 실행해서 직접 동작을 확인해 봅니다.
temp = [ "Python", "Javascript", "C++", "__reserved__", 1, 2 ]
print(temp)
print(temp[0])
['Python', 'Javascript', 'C++', '__reserved__', 1, 2] Python
리스트내의 아이템(element)는 읽고 쓰는 것이 가능하다고 했습니다.
따라서 다음과 같이 리스트 course
의 마지막 아이템을 __reserved__
에서 Go
로 바꾸는 것이 가능합니다.
course = [ "Python", "Javascript", "C++", "__reserved__" ]
course[3] = "Go"
리스트 course
의 첫번째 아이템인 "Python"에 대해서도, 문자열 타입임을 알고 있기에 다음과 같이 문자열 method를 적용하는 것도 가능합니다.
그리고 새로운 문자열 변수에 아이템을 값을 대입하는 것도 가능합니다.
course[1].upper()
newStr = course[1]
리스트에 포함된 아이템들에 대해서 추가적인 작업을 원한다면, 이미 Step.3 Functions에서 수업한 함수들(아래 사이트 참조)을 사용할 수 있습니다.
[참고문헌] https://docs.python.org/3/library/functions.html#len
print(len(course))
print(max(course))
print(min(course))
print(sorted(course))
print(sorted(course, reverse=True))
정수와 정수를 더하거나, 문자열에 문자열을 더하는 것이 가능하듯이, 아래처럼 리스트에 리스트를 더해서 새로운 리스트를 만드는 것도 가능합니다.
requestedCourse = [ "HTML5", "CSS3" ]
newCourse = course + requestedCourse
지금까지 설명한 예제를 하나의 프로그램으로 묶고 실행하여 결과를 확인하기 편하게 하면, 다음과 같습니다.
course = [ "Python", "Javascript", "C++", "__reserved__" ]
print(course)
course[3] = "Go"
print(course)
print(course[1].upper())
newStr = course[1] + " language"
print(newStr)
print(len(course))
print(max(course))
print(min(course))
print(sorted(course))
print(sorted(course, reverse=True))
requestedCourse = [ "HTML5", "CSS3" ]
newCourse = course + requestedCourse
print(newCourse)
아래의 입력창에 위의 구문을 실행해서 직접 동작을 확인해 봅니다.
course = [ "Python", "Javascript", "C++", "__reserved__" ]
print(course)
course[3] = "Go"
print(course)
print(course[1].upper())
newStr = course[1] + " language"
print(newStr)
print(len(course))
print(max(course))
print(min(course))
print(sorted(course))
print(sorted(course, reverse=True))
requestedCourse = [ "HTML5", "CSS3" ]
newCourse = course + requestedCourse
print(newCourse)
['Python', 'Javascript', 'C++', '__reserved__'] ['Python', 'Javascript', 'C++', 'Go'] JAVASCRIPT Javascript language 4 Python C++ ['C++', 'Go', 'Javascript', 'Python'] ['Python', 'Javascript', 'Go', 'C++'] ['Python', 'Javascript', 'C++', 'Go', 'HTML5', 'CSS3']
in
연산자 이해하기¶Python에는 in
연산자가 있으며, 리스트에 적용하여 많이 사용하는데, 단어 의미 그대로 리스트 속에 있나?
입니다.
문법은 단순하게 값(혹은 값을 가지는 변수) in 리스트
의 형태인데, 아래의 예제를 읽어보기 바랍니다.
# Case.1
course = [ "Python", "Javascript", "C++", "__reserved__" ]
print("C" in course)
# Case.2
print("C" in [ "Python", "Javascript", "C++", "__reserved__" ])
# Case.3
print(1 in [0, 1, 2, 3])
Case.1은 복수의 문자열을 가진 리스트 course안에 "C" 문자열이 있는지 확인합니다.
Case.2는 복수의 문자열을 가진 리스트를 직접 주고, 이 리스트 안에서 "C" 문자열이 있는지 확인합니다.
Case.3는 복수의 정수를 가진 리스트를 직접 주고, 이 리스트 안에서 정수 1이 있는지 확인합니다.
아래의 입력창에 위의 구문을 실행해서, 어떤 결과값이 나타나는 지를, 직접 동작을 확인해 봅니다.
course = [ "Python", "Javascript", "C++", "__reserved__" ]
print("C" in course)
print("C" in [ "Python", "Javascript", "C++", "__reserved__" ])
print(1 in [0, 1, 2, 3])
False False True
이미 존재하는 리스트의 일부를 사용해서 새로운 리스트를 만드는 것을 리스트 슬라이싱(Slicing)이라고 합니다.
이런 기능을 수행하는 문법을 우리는 이미 문자열을 다루면서 배웠는데, 본 수업의 초반에서도 언급한, []
문법을 사용하는 것입니다.
만약, 다음의 리스트 course
에서 두번째와 세번째 아이템만 뽑아서, 새로운 리스트 newCourse
를 만든다면 어떻게 해야할까?
course = [ "Python", "Javascript", "C++", "__reserved__" ]
문자열에서 []
문법을 설명하면서, 문자열의 n
번째에서 m-1
까지의 글자를 추출할때, [n:m]
처럼 한것을 기억한다면, 리스트에도 동일하게 하면됩니다.
즉 새로운 리스트 newCourse
는 다음과 같이 만들수 있습니다.
newCourse = course[1:3]
[]
문법의 원래 정의는 [start:end:step]
으로서, 숫자를 [n]
처럼 하나만 주면 해당 n
의 위치를 나타내고,
숫자를 두개 주면 [start:end]
으로서 start에서 end-1번째 아이템을 추출한다는 의미입나다.
숫자를 세개 구는 경우는 [start:end:step]
로서 start부터 end-1까지 아이템을 추출하되, step개씩 건너띄면서 추출하겠다는 것입니다.
즉, course[0:4:2]
으로 하면 0
번째 아이템에서 4
번째 아이템 중에서, 0
/2
번째 아이템을 추출하는 것을 의미합니다.
print(course[0:4:2])
print(course[1:4:2])
print(course[::-1])
print(course[::-2])
지금까지 설명한 예제를 하나의 프로그램으로 묶고 실행하여 결과를 확인하기 편하게 하면, 다음과 같습니다.
course = [ "Python", "Javascript", "C++", "__reserved__" ]
newCourse = course[1:3]
print(newCourse)
print(course[0:4:2])
print(course[1:4:2])
print(course[::-1])
print(course[4:0:-2])
아래의 입력창에 위의 구문을 실행해서 직접 동작을 확인해 봅니다.
course = [ "Python", "Javascript", "C++", "__reserved__" ]
newCourse = course[1:3]
print(newCourse)
print(course[0:4:2])
print(course[1:4:2])
print(course[::-1])
print(course[4:0:-2])
['Javascript', 'C++'] ['Python', 'C++'] ['Javascript', '__reserved__'] ['__reserved__', 'C++', 'Javascript', 'Python'] ['__reserved__', 'Javascript']
리스트는 복사(copy)하거나 별칭(aliasing)을 만들수 있습니다.
복사는 원래 리스트(원본)의 전체 아이템을 복사하여 새로운 리스트를 만드는 것이며, 별칭은 하나의 리스트에 대한 다른 이름을 또 하나 주는 것을 의미합니다.
복사본의 수정은 원본에 변경을 주지 못하지만, 별칭의 수정은 원본에 대한 또 다른 이름을 준 것 뿐이기에 원본의 수정이 이루어 집니다.
아래는 복사와 별칭을 모두 한번에 담은 코드이므로, 처음부터 끝까지 읽으면서 결과를 예측해 봅니다.
course = [ "Python", "Javascript", "C++", "__reserved__" ]
courseAliasing = course # Alising
courseCopy = course[:] # Copy whole elements
print("[Before]")
print("course: ", course)
print("courseAliasing: ",courseAliasing)
print("courseCopy: ", courseCopy)
courseAliasing[3] = "CSS3"
courseCopy[3] = "HTML5"
print("[After]")
print("course: ", course)
print("courseAliasing: ",courseAliasing)
print("courseCopy: ", courseCopy)
아래의 입력창에 위의 구문을 실행해서 직접 동작을 확인해 봅니다.
course = [ "Python", "Javascript", "C++", "__reserved__" ]
courseAliasing = course # Alising
courseCopy = course[:] # Copy whole elements
print("[Before]")
print("course: ", course)
print("courseAliasing: ",courseAliasing)
print("courseCopy: ", courseCopy)
courseAliasing[3] = "CSS3"
courseCopy[3] = "HTML5"
print("[After]")
print("course: ", course)
print("courseAliasing: ",courseAliasing)
print("courseCopy: ", courseCopy)
[Before] course: ['Python', 'Javascript', 'C++', '__reserved__'] courseAliasing: ['Python', 'Javascript', 'C++', '__reserved__'] courseCopy: ['Python', 'Javascript', 'C++', '__reserved__'] [After] course: ['Python', 'Javascript', 'C++', 'CSS3'] courseAliasing: ['Python', 'Javascript', 'C++', 'CSS3'] courseCopy: ['Python', 'Javascript', 'C++', 'HTML5']
지금까지 배운 정수, 실수 및 문자열을 함수에 전달하고 결과값으로 받은 것처럼, 리스트도 함수에 입출력으로 사용합니다.
문법은 다르지 않으므로, 다음과 같이 그냥 하던대로 하면 됩니다.
먼저 함수에 입력 파라메타로 리스트를 전달하는 것을 아래의 예제를 통해서 이해해 봅니다.
def printList(givenList):
print(givenList)
course = [ "Python", "Javascript", "C++", "__reserved__" ]
printList(course)
다음으로 리스트를 함수의 결과값으로 돌려주는 방법을 다음의 코드를 통해 이해해 봅니다.
아래의 코드는 리스트를 입력 받은 함수가, 리스트를 수정하는 것으로서, 코드를 살펴보면 별도의 return
구문이 없는 것을 알수 있습니다.
이처럼 기본적으로 리스트를 전달받은 함수가 리스트 내부를 수정/변경하면, 함수가 끝나고 돌아갔을때 원본이 바뀌어 있습니다.
def removeTailItem(givenList):
del givenList[-1]
print("[in removeTailItem] ", givenList)
course = [ "Python", "Javascript", "C++", "__reserved__" ]
print("[Before function call] ", course)
removeTailItem(course)
print("[After function call] ", course)
아래의 입력창에 위의 구문을 실행해서 직접 동작을 확인해 봅니다.
def printList(givenList):
print(givenList)
course = [ "Python", "Javascript", "C++", "__reserved__" ]
printList(course)
def removeTailItem(givenList):
del givenList[-1]
print("[in removeTailItem] ", givenList)
course = [ "Python", "Javascript", "C++", "__reserved__" ]
print("[Before function call] ", course)
removeTailItem(course)
print("[After function call] ", course)
['Python', 'Javascript', 'C++', '__reserved__'] [Before function call] ['Python', 'Javascript', 'C++', '__reserved__'] [in removeTailItem] ['Python', 'Javascript', 'C++'] [After function call] ['Python', 'Javascript', 'C++']
리스트의 아이템을 다시 리스트로 만드는 복잡한 구조도 가능하며, 사실 많이 쓰이는 방법이다.
만약 성적을 처리함에 있어서, 과목명과 점수를 한번에 처리하고자 한다면, 다음과 같이 리스트 안에 리스트를 넣는 형태로 구현 가능하다.
리스트안에 리스트에 있는 아이템을 접근하기 위해서, 아래와 같이 []
첨자를 [][]
처럼 복수로 사용하는 것을 이해하자.
student1 = [["Python", 76.5], ["C++", 97], ["Javascript", 99]]
print(student1)
print(student1[1])
student1[1][1] = 98
print(student1[1])
print(student1)
student1 = [["Python", 76.5], ["C++", 97], ["Javascript", 99]]
print(student1)
print(student1[1])
student1[1][1] = 98
print(student1[1])
print(student1)
[['Python', 76.5], ['C++', 97], ['Javascript', 99]] ['C++', 97] ['C++', 98] [['Python', 76.5], ['C++', 98], ['Javascript', 99]]
리스트도 Class 이므로 멤버 데이터와 멤버 Methods가 기본적으로 제공됩니다.
Python 언어 사이트의 < https://docs.python.org/3/tutorial/datastructures.html >에서 리스트의 Methods를 확인할 수 있습니다.
다양한 Methods가 제공되므로, 이번 기회에 이름과 가능에 대해서 한번 읽어보고, 나중에 필요시 사용할 수 있도록 합니다.
주요한 Methods들에 대해서 간단하게 설명해 보도록 하겠습니다.
(a) append()
: 리스트에 아이템을 마지막에 추가함
(b) extend()
: 리스트에 주어진 리스트의 아이템을 마지막에 추가함
(c) insert()
: 리스트의 주어진 위치에 주어진 아이템을 삽입하고, 삽입된 위치의 기존 아이템은 뒤에 위치하도록 함
(d) remove()
: 리스트내에서 주어진 아이템과 동일한 아이템을 모두 제거함
(e) count()
: 리스트에서 주어진 아이템과 동일한 아이템의 갯수를 카운트함
(f) sort()
: 리스트내의 아이템을 순서대로 정렬함
(g) reverse()
: 리스트내의 아이템을 역순으로 정렬함
(h) pop()
: 리스트의 마지막 아이템을 돌려주면서, 해당 아이템을 리스트에서 제거함
설명한 주요 함수들을 활용한, 간단한 예제 프로그램을 아래와 같이 만들었으니, 아래의 입력창에 위의 구문을 실행해서 직접 동작을 확인해 봅니다.
course = [ "Python", "Javascript", "C++", "__reserved__" ]
print(course)
print(course.pop())
print(course)
course.sort()
print(course)
course.append("Go")
course.append(["HTML5", "CSS3"])
print(course)
course.reverse()
print(course)
print(course.count("C++"))
course = [ "Python", "Javascript", "C++", "__reserved__" ]
print(course)
print(course.pop())
print(course)
course.sort()
print(course)
course.append("Go")
course.append(["HTML5", "CSS3"])
print(course)
course.reverse()
print(course)
print(course.count("C++"))
['Python', 'Javascript', 'C++', '__reserved__'] __reserved__ ['Python', 'Javascript', 'C++'] ['C++', 'Javascript', 'Python'] ['C++', 'Javascript', 'Python', 'Go', ['HTML5', 'CSS3']] [['HTML5', 'CSS3'], 'Go', 'Python', 'Javascript', 'C++'] 1
프로그램을 작성하다보면, 비어있는 리스트를 만들고, 계산결과를 비어있는 리스트에 넣게 되는 경우가 종종 발생합니다.
이런 경우는 listName = []
과 같이하여, listName"
이 [
과 ]
구문을 사용하여 만들어 지는 리스트 이지만, 아직 아이템이 없다는 것으로 Python에 알려줍니다.
listName = []
listName
[]
리스트 kingdoms는 ['Bacteria', 'Protozoa','Chromista','Plantae','Fungi','Animalia']
의 값을 가집니다.
kingdoms 리스트에서 다음 아이템들을 slicing 혹은 index를 이용하여 출력해 봅니다.
(a) kingdoms
의 첫번째 item
(b) kingdoms
의 마지막 item
(c) ['Bacteria', 'Protozoa','Chromista']
(d) ['Chromista','Plantae','Fungi']
(e) ['Fungi','Animalia']
아래의 입력창에 위의 구문을 실행해서 직접 동작을 확인해 봅니다.
kingdoms = ['Bacteria', 'Protozoa','Chromista','Plantae','Fungi','Animalia']
print(kingdoms[0])
print(kingdoms[-1])
print(kingdoms[0:3])
print(kingdoms[2:5])
print(kingdoms[4:])
Bacteria Animalia ['Bacteria', 'Protozoa', 'Chromista'] ['Chromista', 'Plantae', 'Fungi'] ['Fungi', 'Animalia']
리스트 ids는 [4353,2314,2956,3382,9362,3900]
의 값을 가집니다.
ids 리스트에서 다음 아이템들을 리스트의 Methods와 필요시 slicing 혹은 index를 사용하여 출력해 봅니다.
(a) 리스트 ids로부터 3382 를 제거합니다.
(b) 9362의 를 출력해 봅니다.
(c) 9362뒤에 4499 를 넣습니다.
(d) 리스트 ids에 [5566,1830]
를 추가하여 리스트 ids를 확장합니다.
(e) 리스트 ids의 순서를 거꾸로 뒤바꿉니다.
(f) 리스트 ids를 정렬합니다.
아래의 입력창에 위의 구문을 실행해서 직접 동작을 확인해 봅니다.
ids = [4353,2314,2956,3382,9362,3900]
del ids[3]
print(ids)
print(ids[3])
ids.insert(4,4499)
print(ids)
ids.extend([5566,1830])
print(ids)
ids.reverse()
print(ids)
ids.sort()
print(ids)
[4353, 2314, 2956, 9362, 3900] 9362 [4353, 2314, 2956, 9362, 4499, 3900] [4353, 2314, 2956, 9362, 4499, 3900, 5566, 1830] [1830, 5566, 3900, 4499, 9362, 2956, 2314, 4353] [1830, 2314, 2956, 3900, 4353, 4499, 5566, 9362]
Step_12_Loop_Part_2 (0) | 2021.06.02 |
---|---|
Step_11_Loop_Part_1 (0) | 2021.05.30 |
Step_09_Method_and_Class (0) | 2021.05.26 |
Step_08_Module (0) | 2021.05.23 |
Step_07_Conditional_Statement (0) | 2021.05.20 |
댓글 영역