Today
Total
Recent Posts
Link
반응형
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
관리 메뉴

아임'준

[파이썬 기초] 리스트, 튜플, 딕셔너리, 레인지 본문

[Python]/[Python : 개념]

[파이썬 기초] 리스트, 튜플, 딕셔너리, 레인지

아임'준 2021. 3. 27. 20:29
반응형

파이썬 / Python / 리스트 / 튜플 / 딕셔너리 / 레인지 / list / tuple / dictionary / range

*해당 글에 있는 코드들은 모두 복사해서 사용할 수 있게끔 만들어두었습니다. 주석만 보고 이해하려고 하지 말고 코드를 복사해서 직접 실행하며 그 결과를 통해 이해하고자 하면 더 도움이 될것입니다. 물론 그냥 복사 붙여넣기 하는 것보다 본인이 직접 코드를 타이핑하는 것이 이해와 후에 사용할 때에 더 큰 도움이 될 것이니 이 점 명심하고 공부해주시기 바랍니다

 

 

오늘은 파이썬의 자료형인 리스트, 튜플, 딕셔너리, 레인지에 대해서 알아보도록 하겠다.

리스트, 튜플, 레인지는 시퀀스형 자료형이다. 딕셔너리는 매핑형 이라고 한다. 

 

리스트, 튜플, 레인지를 설명하기 전에 알고 가야할 것이 있다. 바로 인덱싱이다.

인덱싱

string이라는 변수에 "Hello World"라는 문자열을 저장했다고 생각해보자.

string = "Hello World"

그런데 내가 string이라는 변수의 첫번째 글자와 4번째 글자가 궁금하다. 어떻게 하면 첫번째 글자와 4번째 글자가 무엇인지 알 수 있을까?

 

문자열은 사실 문자를 여러개 순서대로 입력해놓은 것이다. 파이썬에서는 이렇게 순서대로 있는 정보들에 대해서 접근할 수 있다.

 

이럴 때 사용하는 개념이 바로 인덱싱이다. 컴퓨터는 맨 앞부터 숫자를 부여하며 0부터 시작하여 1씩 증가해나간다.

파이썬에서는 또한 맨 뒤부터 -1이라는 숫자를 부여하여 이를 인덱싱 해주기도 하는데 이를 negative indexing 이라고 한다.

말로만 들어서는 이해가 힘들 수 있으니 표를 보여주겠다.

 

예) Hello World라는 문자열을 저장하였을 때 인덱싱

H e l l o   W o r l d
0 1 2 3 4 5 6 7 8 9 10
-11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

이렇게 각 문자에 번호가 부여된다.

이제 우리는 아래와 같이 적음을 통해 1번째와 4번째 글자가 무엇인지 알 수 있다.

string = "Hello World"

print(string[0])
print(string[3])

인덱스를 사용하는 방법은 인덱스를 사용할 수 있는 변수 뒤에 [대괄호]를 표기하며 대괄호 안에 숫자를 지정함을 통해 사용할 수 있다. 내가 1번째와 4번째 글자가 무엇인지 궁금하다고 했는데 인덱스를 0과 3이라는 숫자를 사용하였는데 그 이유는 아까 말했듯 컴퓨터는 0부터 세기 때문에 내가 생각한 순서보다 1을 뺴주어야 하는 것이다.

 

네거티브 인덱싱은 뒤에서부터 데이터에 접근해야할 때 유용하게 쓸 수 있다.

 

또한 다음과 같은 방식을 통해 Hello World에서 Hello만 출력할 수 있다.

string = "Hello World"

print(string[0:5])
print(string[:5])

0:5라고 적으면 0,1,2,3,4 즉 0부터 5가 되기 전이라는 뜻으로 해석할 수 있다. 0<= x <5 와 같은 형식으로 생각하면 된다. 헷갈리지 말자!

만약 앞에 숫자를 적지 않을 경우 기본적으로 0이 들어와 있다고 가정하고 진행한다. 이를 이용하면 뒤에 World만 뽑을 수도 있다.

 

이상 짧게 설명한 문자열 인덱싱이었다.

리스트 / list

리스트는 C언어의 배열과 비슷하면서 다르다.

 

리스트는 [대괄호]로 표기한다. 위에서 얘기한 string의 인덱싱과는 아예 다른 이야기이다. 헷갈리면 안된다. 위에서 설명한 내용은 string 변수에 대해서 인덱스를 통해 원하는 문자에 접근이 가능하다는 뜻이며 string을 선언할 때는 따옴표들로 감싸준다고 설명한 적이 있다. 리스트는 [대괄호]로 이를 감싸줌을 통해 선언하는 것이다. 리스트를 선언하고 싶으면 다음과 같은 방식으로 선언할 수 있다.

a = []
b = [3, "Hi", True] #콤마(,)로 각 요소를 구분

print(type(a)) #<class "list"> 출력됨
print(type(b)) #<class "list"> 출력됨

리스트는 여러 자료형의 값들을 순차적으로 저장할 수 있는데 이 때문에 시퀀스형 자료형이라고 한다.

 

그럼 이렇게 적힌 리스트의 각 값들에는 어떻게 접근할 수 있을까?

그 방법은 바로 위에 설명한 인덱싱이다.

 

리스트에 있는 값에 접근하기 위해서는 문자열 인덱싱에서 했던 것처럼 같은 과정을 거치면 된다. 예를 들어 두번째 값에 접근하고 싶다면 a[1]을 통해 접근할 수 있다.

a = [777, "June", False]

print(a)
print(a[0])
print(a[1:3])

위 코드를 실행할 경우 어떤 결과가 나올지 생각해보자.

첫번째 프린트문의 경우 a를 출력하라고 했으니 list인 a가 전부 출력될 것이다.

두번째 프린트문의 경우 인덱스로 0을 지정했으니 맨 앞의 값이 출력될 것이다.

세번째 프린트문의 경우 1:3이라고 지정했으니 두번째부터 4번째가 되기 전까지의 값들이 출력될 것이며 이 또한 리스트 형태로 출력을 할 것이다.

 

그렇기에 결과는

위와 같을 것이다.

 

중요한 것이 있는데 리스트 안에는 리스트가 들어갈 수도 후에 배울 튜플, 딕셔너리도 들어갈 수도 있다. 예를 들어 리스트 안에 리스트가 있을 때

a = [[1, 2], 5]

print(a)
print(a[0])
print(a[0][1])

위와 같은 결과를 얻을 수 있다. 세번째 프린트문의 경우 먼저 a[0]를 지정한 후  a[0]의 1을 인덱스로 가지는 값을 출력하라고 한 것이다. 예시는 이중이지만 삼중도 된다.

 

이제 이 리스트의 활용법에 대해서 알아보도록 하자. 기본적인 몇개만 설명하고 리스트 관련 페이지 링크를 걸어줄 것이다.

a = [777, "June", False]
b = [1, 2, 3, "wow"]
c = a + b

print(c)

위와 같이 코드를 작성하였을 때 +라는 연산자는 우리가 일반적으로 아는 수학의 더하기가 아니다. c를 출력해보면 a와 b가 이어져서 저장되었다는 것을 알 수 있다.

 

보통 우리가 아는 변수 뒤에 .을 붙여 특정한 기능을 사용하는 것들을 메소드라고 한다. 이에 대한 설명은 나중에 하게 될 것이니 그냥 지금은 굳이 명칭에 의미를 두지 말고 아 이렇게 하면 그렇게 되는구나? 생각하면 된다.

메소드:
a.append(~)

. 뒤에 붙이는걸 메소드라고 한다 (여기서 a는 변수)

 

우리는 리스트에 append, insert, remove, sort를 할 수 있다.

 

우선 append는 리스트의 맨 마지막에 새로운 데이터를 넣어준다.

list.append(x) #x를 리스트 a의 맨 뒤에 저장한다

 

insert 또한 리스트에 새로운 값을 입력해주는 것이지만 어디에 데이터를 삽입할지 인덱스로 지정해줄 수 있다. 물론 그 인덱스에 원래 위치하던 것은 없어지는 것이 아니라 뒤로 밀린다.

list.insert(i,x) #인덱스 i자리에 x를 삽입

이때 i가 지금 리스트의 길이보다 길다면 맨 뒤에 저장해버린다. i를 7로 입력했는데 리스트의 인덱스가 3까지밖에 없을경우 4가 된다는 뜻

 

remove는 지우고 싶은 값을 입력하면 그 값과 일치하는 가장 첫번째 데이터를 지워준다. 지우면 그 자리는 빈자리가 아니라 하나씩 앞으로 당겨진다. 만약 없는 값을 지우겠다고 remove를 사용할 시 ValueError가 일어난다.

list.remove(x) #x와 동일한 데이터를 가장 앞부터 찾아서 삭제함

 

마지막으로 sort는 정말 편리하다. 우리는 별다른 작업 없이 sort라는 메소드를 이용하여 리스트 안의 값들을 오름차순, 내림차순 정렬할 수 있다. 대신 같은 자료형이어야된다. 숫자와 문자의 비교는 할 수 없다. (단 불리안의 경우 True는 1, False는 0으로 인식하여 숫자와 비교 가능하다)

list.sort(reverse=True/False) #reverse는 기본적으로 False로 돼있으며 True로 바꾸면 내림차순 정렬

reverse로 오름차순과 내림차순을 설정할 수 있다.

 

사용 예시는 아래와 같다.

a = [777, "June", False]

a.append("Hi")
a.insert(2,"insert")
a.remove("June")

print(a)

가장 많이 쓰는 것 네개만 꼽아보았다. 다른 메소드들이 궁금할 시 여기 클릭

아래 사진은 리스트와 같은 가변형 시퀀스를 사용할 수 있는 여러 방식이다.

 

튜플 / tuple

튜플은 (소괄호)로 표기한다. 튜플은 리스트와 거의 다를게 없지만 결정적인 부분 하나가 다르다.

 

튜플은 값을 변경할 수 없다. 튜플은 다음과 같이 선언할 수 있다.

a = ()
b = (3, "Hi", True) #콤마(,)로 각 요소를 구분

print(type(a)) #<class 'tuple'> 출력됨
print(type(b)) #<class 'tuple'> 출력됨

리스트와 마찬가지로 웬만한 자료형들이 모두 튜플에 들어갈 수 있다.

 

하나 주의할 점은 a = (1)과 같이 하나의 인자만 가지는 튜플은 만들 수 없다. a=()의 경우를 제외하고는 ,가 있어야지 튜플이 생성된다. 만약 하나의 인자로만 튜플을 만들고 싶다면 a=(1,) 이렇게 콤마를 넣어주면 된다. 나머지는 리스트와 동일하다.

 

여기서 하나 집고 넘어가자면 리스트와 튜플은 서로 변환이 가능하다. 서로 뿐만 아니라 변환되는 것이 여러개가 있는데 변환하는 방법은 변환하고 싶은 것 앞에 tuple([1,2,3]) / list((1,2,3)) 등을 통해 변환할 수 있다. 후에 나올 딕셔너리와의 응용도 가능하다.

레인지 / range

레인지는 범위를 지정할 수 있게 한다. 내가 0부터 50까지의 범위를 가지고 싶을 때 아래와 같이 쓸 수 있겠다.

my_range = range(51)

0:3이 3까지는 포함하지 않았던 것처럼 range도 51까지 포함하지 않고 50까지만 포함한다. 

레인지를 정확히 쓰는 방법은 아래와 같다.

range(j) # 0부터 j-1까지 범위 생성 (총 j개)
range(i,j,k) # i부터 j까지 k의 간격을 가지고 범위 생성

두번째 range의 경우 k를 적지 않을경우 자동적으로 1이라고 생각하고 실행한다. 이때 k를 step이라고 하는데 step은 정수여야 하며(음수도 가능) 0일 시에 ValueError가 일어난다.

 

a=range(10)

print(a)
print(type(a))

위와 같이 코드를 작성하고 실행할 경우 0부터 9까지를 출력해야할 것 같으나 출력으로 얻는 것은 range(0,10)이라고 적힌 것이다. type은 당연히 range라고 뜰 것이다. range 내부에 어떻게 숫자가 들어있는지 확인하기 위해 위에서 언급한 list 함수를 써보겠다.

 

a = range(10)

print(list(a))

이렇게 작성할 경우 리스트로 변한 a가 [0,1,2,~9]까지 정상적으로 출력이 될 것이다.

 

내가 range를 사용할 때는 후에 배울 반복문에서 원하는 횟수를 지정할 때나 숫자가 순서대로 입력된 리스트가 필요할 경우에 사용해왔다.

 

지금까지 리스트, 튜플, 레인지에 대해서 설명했다. 맨 위에서 이 셋은 시퀀스형 자료형이라고 설명했다. 이들은 모두 공통적으로 사용할 수 있는 함수나 방법이 있다. 링크는 여기(링크 타고 들어가서 공통 시퀀스 연산 이라고 적힌 곳을 보면 된다), 아래 사진으로도 첨부하겠다.

위에서 설명한 +와 i:j도 있다. 한번씩 읽어보며 이런 메소드도 있구나 생각하고 나중에 필요하다면 검색해서 쓰자. in, +, len, count 등 모두 알고 있으면 도움이 된다.

딕셔너리 / dictionary

딕셔너리는 앞의 두개와 성격이 조금 다르다. 

 

우리가 사전을 사용할 때 사전이 어떻게 구성되어 있는지 생각해보자. 우리는 찾고싶은 어떤 단어를 찾아가고 해당 페이지에는 그 단어에 대한 뜻이 아래에 적혀있다.

 

파이썬의 딕셔너리도 비슷한 형식이다. 딕셔너리는 key와 value로 구성돼있다.

우선 딕셔너리는 {중괄호}로 표현한다.

my_dict = {}

다음과 같이 적음을 통해 my_dict가 딕셔너리형임을 알려줄 수 있다. 이제 key와 value를 넣는 방법은 다음과 같다

my_dict = {}

my_dict["my_key1"] = 3
my_dict["my_key2"] = "6"
my_dict["my_key3"] = True

다음과 같이 원래 [] 안에 숫자를 넣어서 순서에 맞는 값을 찾아갔는데 이번에는 내가 지정한 Key를 [] 안에 넣음으로써 그에 맞는 값을 찾아갈 수 있다. value에는 위에 적힌 것 뿐만 아니라 리스트 튜플 등 여러분이 생각하는 것들이 모두 들어갈 수 있다.

 

이제 딕셔너리가 어떻게 구성된 것인지 대충 이해했으니 딕셔너리를 활용할 수 있는 함수들과 메소드들을 확인해보도록 하겠다.

del my_dict["my_key3"]

다음과 같은 방법으로 my_key3을 키 값으로 가지는 vlaue를 삭제할 수 있다.

 

여기서 의문점이 생길 수 있는데 앞의 리스트와 튜플은 순차형이기 때문에 내가 숫자만 알면 그 숫자에 해당하는 위치에 있는 값에 접근을 할 수 있다. 하지만 딕셔너리의 경우 키는 정말 내가 정하는 것 그대로이기 때문에 나중에 이를 반복문 등에서 사용할 떄 어떻게 할 수 있는지 궁금해할 수 있는데 그렇기에 딕셔너리는 keys()와 values() 그리고 items() 라는 메소드를 지원한다.

 

keys() 메소드는 해당 딕셔너리의 key들을 반환해준다.

values() 메소드는 해당 딕셔너리의 value들을 반환해준다.

items() 메소드는 해당 딕셔너리의 key와 value들을 짝지어서 반환해준다.

 

아래 예시를 보자

my_dict = {}

my_dict["my_key1"] = 3
my_dict["my_key2"] = "6"
my_dict["my_key3"] = True
my_dict["my_key4"] = ["June", "바보", "False"]

print(my_dict.keys())
print(my_dict.values())
print(my_dict.items())

print(type(my_dict.keys()))
print(type(my_dict.values()))
print(type(my_dict.items()))

참고로 type들을 출력해보면 우리가 아는 자료형들이 아닌 다른 자료형이 나온다. 하지만 언제나 다른 자료형으로 바꾸거나 해당 자료형들을 사용하는 다른 메소드, 함수들이 있을 수도 있다는 것을 인지하고 있자!

 

추가적으로 딕셔너리 활용 함수와 메소드가 궁금한 사람은

docs.python.org/ko/3/library/stdtypes.html#mapping-types-dict

 

질문, 오타 지적, 오류 지적 등은 댓글로 환영합니다.

Comments