본문 바로가기
프로그래밍/Python

[Python/파이썬] 파이썬 기본 자료형 2(리스트, 튜플, 딕셔너리, 집합)

by 별준 2020. 8. 11.

기본 자료형 1에 이어서 리스트(list), 튜플(tuple), 집합(set), 사전(dictionary)형에 대해서 알아봅시다.

 

[리스트 list]

리스트는 데이터의 모음 또는 값을 나열하는 것이라고 할 수 있습니다.

리스트는 대괄호([ ])로 묶어서 표현하며, 리스트에 속하는 요소들은 쉼표(,)로 구분합니다. 요소에는 정수, 실수, 문자열, 리스트 등 모든 자료형이 가능합니다.

list = [ element1, element2, element3, ... ]

 

아래의 여러가지 리스트를 살펴봅시다.

a = []
b = [1, 2, 3]
c = ['My', 'name', "is", 'junstar']
d = [1, 2, 'my', 'name']
e = [1, 2, ['my', 'name']]

a처럼 아무것도 포함하지 않는 리스트를 만들 수도 있고, d처럼 여러 자료형을 포함하는 리스트를 만들 수도 있으며, e와 같이 리스트안에 리스트 자료형을 포함할 수도 있습니다. C/C++이나 JAVA의 배열과 비슷하다고 할 수 있지만, 파이썬에서 더욱 직관적이고 유용하게 사용할 수 있습니다.

비어있는 리스트는 아래와 같이 생성할 수도 있습니다.

a = list()

 

- 리스트의 인덱싱

리스트는 문자열처럼 인덱싱을 적용할 수 있습니다. 결론을 우선 말하자면, 문자열의 인덱싱과 사용법이 동일합니다.

a = [5, 3, 2, 1, 4]
a[0]		# 5
a[0] + a[2]	# 7
a[-1]		# 4
a = [1, 2, 3, ['a', 'b', 'c']]
a[0]		# 1
a[-1]		# ['a', 'b', 'c']
a[3]		# ['a', 'b', 'c']
a[-1][1]	# 'b'
a[3][2]		# 'c'

리스트안에 리스트가 있는 경우에는 C/C++의 이중배열이라고 생각하면 됩니다. a[3]은 리스트이며, 다시 a[3]에서 인덱싱으로 a[3]의 요소를 찾아들어가는 것입니다.

 

- 리스트의 슬라이싱

문자열과 마찬가지로 슬라이싱을 리스트에 동일하게 적용할 수 있습니다.

a = [1, 2, 3, 4, 5]
b = a[:2]	# [1, 2]
c = a[2:]	# [3, 4, 5]
d = a[3:4]	# [4]

 

- 리스트의 연산

더하기(+)

a = [1, 2, 3]
b = [4, 5, 6]
a + b	# [1, 2, 3, 4, 5, 6]

리스트 사이의 + 연산은 2개의 리스트를 합칩니다.

 

곱하기(*)

a = [1, 2, 3]
a * 3	#[1, 2, 3, 1, 2, 3, 1, 2, 3]

리스트의 곱은 곱하는 숫자만큼 반복합니다.

 

리스트의 길이

길이를 구하는 것은 len 함수를 사용하면 됩니다.

a = [1, 2, 3, 4]
len(a)		# 4

 

- 리스트의 변경/삽입/삭제

리스트는 변경이 가능하고, 삽입(append)/삭제(remove)/정렬(sort)이 가능합니다.

a = [1, 2, 3]
a[1] = 15		# a = [1, 15, 3]
a.append(4)		# a = [1, 15, 3, 4]
del a[1]		# a = [1, 3, 4]

b = [2, 5, 1, 4, 3]
b.sort()		# b = [1, 2, 3, 4, 5]
b.sort(reverse=True)	# b = [5, 4, 3, 2, 1]
b.reverse()		# b = [1, 2, 3, 4, 5]

리스트의 삽입은 리스트명.append(요소)로 추가가 가능합니다. 추가된 데이터는 리스트 끝에 삽입됩니다. 

리스트의 삭제는 파이썬 내장함수 del을 사용하며, 'del 객체'로 삭제 가능합니다.

리스트의 정렬도 가능한데, 리스트명.sort()로 가능합니다. 해당 메소드는 리스트는 오름차순 정렬합니다. 내림차순 정렬은 리스트명.sort(reverse=True)로 가능합니다.

reverse 메소드는 리스트를 순서를 뒤집어줍니다.

 

- 리스트 위치 반환

a = [1, 2, 3]
a.index(3)	# 2
a.index(1)	# 0
a.index(0)	# Error 발생

index(x) 함수는 리스트에 x값이 있으면 x의 위치 값을 반환합니다. 만약 리스트에 없는 숫자를 인수로 사용하면 에러(ValueError)가 발생합니다.

 

- 리스트 요소 삽입(insert)

append가 아닌 insert(a, b) 함수로도 리스트 삽입이 가능합니다. 해당 함수는 a번째 위치에 b를 삽입한다는 의미입니다.

a = [1, 2, 3]
a.insert(0, 4)
a		# a = [4, 1, 2, 3]

 

- 리스트 요소 제거(remove)

remove(x)는 리스트에서 처음으로 나오는 x의 값을 삭제하는 함수입니다. x가 리스트에 없으면 에러(ValueError)가 발생합니다. 

a = [1, 2, 3, 1, 2, 3]
a.remove(3)
a	# a = [1, 2, 1, 2, 3]
a.remove(3)
a	# a = [1, 2, 1, 2]

 

- 리스트 요소 끄집어내기(pop)

pop()은 리스트의 맨 마지막 요소를 반환하고, 마지막 요소는 삭제합니다. 즉, 스택의 pop과 동일합니다.(append와 같이 사용하여 스택처럼 사용할 수 있음)

a = [1, 2, 3]
a.pop()		# 3
a		# a = [1, 2]

pop(x)의 형태로도 사용할 수 있는데, 이는 x번째 요소를 반환하고 삭제한다는 의미입니다.

a = [1, 2, 3]
a.pop(1)	# 2
a		# a = [1, 3]

 

- 리스트의 요소의 개수 세기(count)

count(x)는 리스트 안에 x의 값이 몇 개가 있는지 반환합니다.

a = [1, 2, 3, 1, 2]
a.count(1)	# 2

 

- 리스트의 확장(extend)

extend(x)는 리스트 x를 원래의 리스트에 더합니다. x에는 리스트 형만 올 수 있습니다.

a = [1, 2, 3]
a.extend([4, 5])
a		# a = [1, 2, 3, 4, 5]
b = [6, 7]
a.extend(b)
a		# 1 = [1, 2, 3, 4, 5, 6, 7]

 

[튜플 tuple]

튜플은 리스트와 유사합니다. 다만, 대괄호가 아닌 소괄호 ()로 둘러싸며, 튜플의 요소는 변경이 불가능합니다.

t1 = ()
t2 = (1, )
t2_1 = 1,
t3 = (1, 2, 3)
t4 = 1, 2, 3
t5 = ('a'. 'b', ('ab', 'cd'))
t6 = (1, 2, ('a', 'b'))

튜플은 위와 같이 사용할 수 있습니다. 리스트와 모습이 거의 동일하지만 t2, t2_1처럼 요소를 한가지만 가질 때에는 반드시 요소 뒤에 콤마를 붙여야되며, t4처럼 괄호를 생략해도 된다는 점이 다릅니다.

튜플과 리스트의 가장 큰 차이점은 값은 변경할 수 있는 가에 대한 여부입니다. 튜플의 항목 값은 변화가 불가능합니다. 따라서 프로그램이 실행되는 동안 값이 항상 변하지 않기를 원할 때에는 튜플을 사용하는 것이 좋습니다. 실제 프로그램에서는 값이 변경되는 경우가 많이 때문에 튜플보다는 리스트를 많이 사용합니다.

del함수나 인덱싱으로 값은 변경하려는 경우 에러가 발생합니다.

하지만 값을 변화시킬 수 없는 것만 제외하고는 리스트와 완전히 동일합니다.

t1 = (1, 2, 'a', 'b')
t1[1:]	# (2, 'a', 'b')

t2 = (3, 4)
t1 + t2		# (2, 'a', 'b', 3, 4)
t2 * 3		# (3, 4, 3, 4, 3, 4)
len(t1)		# 4

 

[딕셔너리 Dictionary]

딕셔너리는 "이름 = 홍길동", "생일 = 1월 1일" 등으로 대응 관계를 나타낼 수 있는 자료형, Key와 Value를 한 쌍으로 갖는 자료형입니다. 즉, 해시(Hash) 자료구조와 동일하다고 볼 수 있습니다. 

딕셔너리는 리스트와 튜플처럼 순차적(Sequential)으로 해당 요소를 구하지 않고, Key값을 통해서 요소값-Value를 얻습니다. 내부 자료를 순차적으로 검색하는 것이 아닌, Key에 해당하는 것만 살펴봅니다.

 

기본적으로 딕셔너리는 아래와 같이 사용합니다.

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

여러 쌍의 Key와 Value값이 중괄호 { } 로 둘러싸여 있습니다. Key에는 변하지 않는 값을 사용하고, Value는 무관합니다.

 

dic1 = {'name':'pey', 'phone':'0119993323', 'birth':1118}
dic2 = {1:'hi'}
dic3 = {'a':[1,2,3]}

dic1의 Key는 'name', 'phone', 'birth'이고, 각각의 Key에 대응하는 Value는 'pey'(String), '0109993323'(String), 1118(Integer) 입니다. 물론 정수형도 Key나 Value로 사용할 수 있고, Value에 리스트형도 넣을 수 있습니다.

 

딕셔너리는 Key를 사용해서 Value를 얻을 수 있으며, 위의 dic1에서 아래와 같이 사용하여 Value를 얻을 수 있습니다.

dic1['name']	# 'pey' 반환
dic1['birth']	# 1118 반환

즉, 딕셔너리명[Key] 형태를 사용하여 Key에 해당하는 Value를 얻을 수 있습니다.

 

주의해야할 점은 (1)Key를 중복해서 사용하면, 하나를 제외한 나머지는 전부 무시되며, (2)Key에는 리스트형을 사용할 수 없습니다.

a = {1:'a', 1:'b'}
a		# (1:'b')

Key로 사용할 수 있느냐는 Key가 변하는 값인지 아닌지에 달려있습니다.

 

 

- 딕셔너리 쌍 추가, 삭제

 

a = {1:'a'}
a[2] = 'b'
a[5] = 'e'
a		# {1:'a', 2:'b', 5:'e'}

a['name'] = 'pey'
a[3] = [1, 2, 3]
a 		# {1:'a', 2:'b', 5:'e', 'name':'pey', 3:[1,2,3]}

딕셔너리에 a[2] = 'b' 와 같이 입력하면 Key와 Value가 각각 2, 'b'인 딕셔너리 쌍이 추가됩니다.

딕셔너리명[Key] = Value의 형식으로 입력하면 됩니다.

 

del a[1]
a		# {2:'b', 5:'e', 'name':'pey', 3:[1,2,3]}

del함수를 사용하면 딕셔너리의 요소를 삭제할 수 있습니다. del a[Key] 형태로 사용하며, 지정한 Key에 해당하는 딕셔너리 쌍이 삭제됩니다.

 

- 딕셔너리 관련 함수

Key 리스트 만들기(keys)

a = {'name':'pey', 'phone':'0119993233', 'birth':1118}
a.keys()		# dict_keys(['name', 'phone', 'birth'])

keys() 메소드는 딕셔너리 a의 Key만을 모아서 dict_keys 객체를 반환합니다.

+) 파이썬 2.7버전까지는 keys() 메소드는 리스트를 반환했습니다. 리스트 반환은 메모리 낭비가 발생하는데, 파이썬 3.0 이후 버전에서는 이러한 낭비를 줄이기 위해 dict_keys 객체를 반환합니다. 반환값으로 리스트가 필요하면 list(a.keys())를 사용하면 됩니다. dict_keys랑 이후의 배울 dict_values, dict_items 등은 리스트로 변환하지 않더라도 기본적인 반복(iterate)구문을 실행할 수 있습니다.

 

dict_keys 객체는 아래와 같이 사용할 수 있습니다. 리스트와 사용이 비슷하지만, 리스트의 메서드는 사용할 수 없습니다.

Value 리스트 만들기(values)

a.values()를 사용하며, dict_values 객체를 반환합니다다.

 

Key, Value 쌍 반환(items)

a.items()를 사용하며, dict_items 객체를 반환합니다.

 

Key, Value 쌍 모두 지우기(clear)

a.clear()를 사용하면 됩니다. clear 메서드는 딕셔너리 안의 모든 요소를 삭제한며, 빈 딕셔너리 { }로 표현됩니다.

Key로 Value 얻기(get)

get(x) 메서드는 x라는 Key에 대응되는 Value를 반환합니다. a[x]를 사용했을 때와 동일하지만, 존재하지 않는 Key를 가지고 올려고 할 때, a[x]는 에러가 발생되며, a.get(x)는 None을 반환합니다.

만약 Key값이 없을 경우 미리 정해둔 Default 값을 대신 반환하게 할 수 있습니다. get(x, 'Dafault Value') 로 사용합니다.

 

해당 Key가 딕셔너리 안에 있는지 확인하기(in)

 

'Key in 딕셔너리명'로 사용되며, 딕셔너리에 존재하는 Key이면 True, 존재하지 않는 Key이면 False를 반환합니다.

 

 

 

[집합 Set]

집합(set)은 파이썬 2.3부터 지원하고 있으며, 집합에 관련된 것을 쉽게 처리하기 위해 만든 자료형입니다.

아래와 같이 set 키워드를 사용해서 만들 수 있습니다.

s1 = set([1, 2, 3])
s1		# (1, 2, 3)
s2 = set("Hello")
s2		# ('e', 'H', 'l', 'o')
s3 = set()	# 비어있는 set

 

집합 자료형은 위에서 확인할 수 있듯이, 중복을 허용하지 않으며, 순서가 없습니다. 리스트나 튜플은 순서가 있기 때문에 인덱싱을 통하여 값에 접근할 수 있지만, set 자료형은 숫자가 없기 때문에 인덱스로 값을 얻을 수 없습니다. 딕셔너리 또한 순서가 없는 자료형이라 인덱스로 접근할 수 없습니다.

만약 인덱스로 접근하려면, 리스트나 튜플로 변환 후에 해야 합니다.

- 집합 자료형 메서드

값 1개 추가하기(add)

이미 만들어진 set 자료형에 add(x) 메서드를 사용해서 1개의 값을 추가할 수 있습니다.

s1 = set([1, 2, 3])
s1.add(4)
s1		# {1, 2, 3, 4}

 

값 여러개 추가하기(update)

여러 개의 값을 한꺼번에 추가할 때 update(list) 메서드를 사용합니다.

s1 = set([1, 2, 3])
s1.update([4, 5, 6])
s1		# {1, 2, 3, 4, 5, 6}

특정 값 제거하기(remove)

특정 값을 제거할 때 remove(x) 메서드를 사용합니다. 존재하지 않는 값을 인수로 사용하면 에러가 발생합니다.

s1 = set([1, 2, 3])
s1.remove(2)
s1		# {1, 3}

 

- 교집합, 합집합, 차집합 구하기

set 자료형을 사용해서 교집합, 합집합, 차집합을 구할 수 있습니다.

s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])

1. 교집합 구하기

'&' 기호를 사용하면 교집합을 구할 수 있고, 또는 intersection 메서드를 사용해도 동일한 결과를 반환합니다.

2. 합집합 구하기

'|' 기호를 사용하거나 union  메서드를 사용해서 합집합을 구할 수 있습니다.

3. 차집합 구하기

차집합은 '-' 기호나 difference 메서드로 구할 수 있습니다.

 

 

- Reference

https://wikidocs.net/book/1

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

댓글