상세 컨텐츠

본문 제목

파이썬- 컬렉션

개발/python

by IT License 2019. 6. 9. 21:04

본문

파이썬 컬렉션

1. 리스트 (List)

1.리스트는 여러 요소들을 갖는 집합(컬렉션)으로 새로운 요소를 추가하거나 갱신, 삭제하는 일이 가능하다. 파이썬의 리스트는 동적배열(Dynamic Array)로서 자유롭게 확장할 수 있는 구조를 갖는다. 리스트는 그 안의 요소(element)들은 그 값을 자유롭게 변경할 수 있는 Mutable 데이타 타입이다.

리스트의 요소들은 Square bracket([ ])으로 둘러쌓여 컬렉션을 표현하는데, 각 요소들은 서로 다른 타입이 될 수 있으며, 컴마(,)로 구분한다. 요소가 없는 빈 리스트는 "[]"와 같이 표현한다.

a = []     # 빈 리스트

a = ["AB", 10, False]

1-2. 리스트 인덱싱(Indexing)

리스트의 특정 한 요소만을 선택하기 위하여 인덱싱(Indexing)을 사용하는데, 첫번째요소는 "리스트[0]", 두번째 요소는 "리스트[1]" 처럼 표현한다. 즉, 아래 예제에서 처럼 리스트 a 가 있을 때, a[1] 는 두번째 요소 10을 가리킨다. 파이썬 인덱싱에서 한가지 특별한 표현은 인덱스에 -1, -2 같은 음수를 사용할 수 있다는 점이다. 이 때, -1은 현재 리스트의 마지막 요소를, -2는 뒤에서 두번째 요소를 가리킨다.

a = ["AB", 10, False]

x = a[1]        # a의 두번째 요소 읽기

a[1] = "Test"   # a의 두번째 요소 변경

y = a[-1]       # False

1-3. 리스트 슬라이싱(Slicing)

리스트에서 일부 부분 요소들을 선택하기 위하여 슬라이스(Slice)를 사용한다. 슬라이스는 "리스트[처음인덱스:마지막인덱스]"와 같이 인덱스 표현에서 부분집합의 범위를 지정하는 것이다. 인덱스는 0 부터 시작하며, 마지막 인덱스를 원하는 "마지막 요소의 인덱스 + 1"을 의미한다. 만약 처음인덱스가 생략되면, 0 부터 시작되며, 마지막 인덱스가 생략되면, 리스트의 끝까지 포함됨을 의미한다.

a = [1, 3, 5, 7, 10]

x = a[1:3]     # [3, 5]

x = a[:2]      # [1, 3]

x = a[3:]      # [7, 10]

1-4. 리스트 요소 추가,수정,삭제

리스트에 새로운 요소를 추가하기 위해서는 "리스트.append()"를 사용한다. 리스트 요소를 갱신하기 위해서는 리스트 인덱싱을 사용하여 특정요소에 새 값을 넣는다. 리스트 요소를 삭제하기 위해서는 "del 요소"와 같이 특정 요소를 지운다.

a = ["AB", 10, False]

a.append(21.5)  # 추가

a[1] = 11       # 변경

del a[2]        # 삭제

print(a)        # ['AB', 11, 21.5]

1-5. 리스트 병합과 반복

두 개의 리스트를 병합하기 위해서는 플러스(+)를 사용한다. 이 때 두 리스트는 순서대로 병합된 새로운 하나의 리스트가 된다. 하나의 리스트를 N 번 반복하기 위해서는 "리스트 * N"와 같이 표현할 수 있다. 이는 동일한 리스트를 계속 반복한 새 리스트를 만들게 된다.

# 병합

a = [1, 2]

b = [3, 4, 5]

c = a + b

print(c)   # [1, 2, 3, 4, 5]

 

# 반복

d = a * 3

print(d)   # [1, 2, 1, 2, 1, 2]

1-6. 리스트 검색

리스트 안에 특정 요소를 검색하기 위해서 index() 메서드를 사용한다. 또한 특정 요소가 몇 개 있는지 체크하기 위해서 count() 메서드를 사용할 수 있다.

mylist = "This is a book That is a pencil".split()

i = mylist.index('book')  # i = 3

n = mylist.count('is')    # n = 2

print(i, n)

1-7. List Comprehension

리스트의 [...] 괄호 안에 for 루프를 사용하여 반복적으로 표현식(expression)을 실행해서 리스트 요소들을 정의하는 특별한 용법이 있는데, 이를 List Comprehension 이라 부른다. 이는 아래와 같은 문법으로 컬렉션으로부터 요소를 하나씩 가져와 표현식을 실행하여 그 결과를 리스트에 담는 방식이다. 여기서 if 조건식은 옵션으로 추가될 수 있는데 for 루프에서 이 조건식에 맞는 요소만 표현식을 실행하게 된다. 

[표현식 for 요소 in 컬렉션 [if 조건식]]

아래 예제는 0부터 9까지 숫자들중 3으로 나눈 나머지가 0인 숫자에 대해 그 제곱에 대한 리스트를 구한 예이다.

list = [n ** 2 for n in range(10) if n % 3 == 0]

print(list)

# 출력: [0, 9, 36, 81]

 

2. 튜플 (Tuple)

Tuple은 리스트와 비슷하게 여러 요소들을 갖는 컬렉션이다. 리스트와 다른 점은 Tuple은 새로운 요소를 추가하거나 갱신, 삭제하는 일을 할 수 없다. 즉, Tuple은 한변 결정된 요소를 변경할 수 없는 Immutable 데이타 타입이다. 따라서, Tuple은 컬렉션이 항상 고정된 요소값을 갖기를 원하거나 변경되지 말아야 하는 경우에 사용하게 된다.

튜플의 요소들은 둥근 괄호(...) 를 사용하여 컬렉션을 표현하는데, 각 요소들은 서로 다른 타입이 될 수 있으며, 컴마(,)로 구분한다. 요소가 없는 빈 튜플은 "()"와 같이 표현한다.

t = ("AB", 10, False)

print(t)

특히 요소가 하나일 경우에는 요소 뒤에 콤마를 붙여 명시적으로 Tuple임을 표시해야 한다. 아래 예제를 보면 첫번째 (123) 의 경우, 이는 산술식의 괄호로 인식하여 t1의 타입이 정수가 된다. 이러한 혼동을 방지하기 위해 t2 에서 처럼 (123,) 콤마를 붙여 명시적으로 Tuple임을 표시한다.

t1 = (123)

print(t1)  # int 타입

 

t2 = (123,)

print(t2)  # tuple 타입

 

 

 

3. Dictionary (dict)

Dictionary는 "키(Key) - 값(Value)" 쌍을 요소로 갖는 컬렉션이다. Dictionary는 흔히 Map 이라고도 불리우는데, 키(Key)로 신속하게 값(Value)을 찾아내는 해시테이블(Hash Table) 구조를 갖는다.

파이썬에서 Dictionary는 "dict" 클래스로 구현되어 있다. Dictionary의 키(key)는 그 값을 변경할 수 없는 Immutable 타입이어야 하며, Dictionary 값(value)은 Immutable과 Mutable 모두 가능하다. 예를 들어, Dictionary의 키(key)로 문자열이나 Tuple은 사용될 수 있는 반면, 리스트는 키로 사용될 수 없다.

Dictionary의 요소들은 Curly Brace "{...}" 를 사용하여 컬렉션을 표현하는데, 각 요소들은 "Key:Value"" 쌍으로 되어 있으며, 요소간은 콤마로 구분한다. 요소가 없는 빈 Dictionary는 "{}"와 같이 표현한다. 특정 요소를 찾아 읽고 쓰기 위해서는 "Dictionary변수[키]"와 같이 키를 인덱스처럼 사용한다.

scores = {"철수": 90, "민수": 85, "영희": 80}

v = scores["민수"]   # 특정 요소 읽기

scores["민수"] = 88  # 쓰기

print(t)

파이썬의 Dictionary는 생성하기 위해 위의 예제와 같이 {...} 리터럴(Literal)을 사용할 수도 있지만, 또한 dict 클래스의 dict() 생성자를 사용할 수도 있다. dict() 생성자는 (아래 첫번째 예처럼) Key-Value 쌍을 갖는 Tuple 리스트를 받아들이거나 (두번째 예처럼) dict(key=value, key=value, ...) 식의 키-값을 직접 파라미터로 지정하는 방식을 사용할 수 있다.

# 1. Tuple List로부터 dict 생성

persons = [('김기수', 30), ('홍대길', 35), ('강찬수', 25)]

mydict = dict(persons)

 

age = mydict["홍대길"]

print(age)   # 35

 

# 2. Key=Value 파라미터로부터 dict 생성

scores = dict(a=80, b=90, c=85)

print(scores['b'])  #90

2. 추가,수정,삭제,읽기

Dictionary 요소를 수정하기 위해서는 "Dictionary[키]=새값"와 같이 해당 키 인덱스를 사용하여 새 값을 할당하면 된다. Dictionary에 새로운 요소를 추가하기 위해서는 수정 때와 마찬가지로 ("맴[새키]=새값") 새 키에 새 값을 할당한다. Dictionary 요소를 삭제하기 위해서는 "del 요소"와 같이 하여 특정 요소를 지운다.

scores = {"철수": 90, "민수": 85, "영희": 80}

scores["민수"] = 88   # 수정

scores["길동"] = 95   # 추가

del scores["영희"]

print(scores)

# 출력 {'철수': 90, '길동': 95, '민수': 88}

Dictionary에 있는 값들을 모두 출력하기 위해서는 다음과 같이 루프를 사용할 수 있다. 아래 예제에서 for 루프는 scores 맵으로부터 키를 하나씩 리턴하게 된다. 이때 키는 랜덤하게 리턴되는데, 이는 해시테이블의 속성이다. 각 키에 따른 값을 구하기 위해서는 scores[key]와 같이 사용한다.

scores = {"철수": 90, "민수": 85, "영희": 80}

 

for key in scores:

    val = scores[key]

    print("%s : %d" % (key, val))

3. 유용한 dict 메서드

Dictonary와 관련하여 dict 클래스에는 여러 유용한 메서드들이 있다. dict 클래스의 keys()는 Dictonary의 키값들로 된 dict_keys 객체를 리턴하고, values()는 Dictonary의 값들로 된 dict_values 객체를 리턴한다.

scores = {"철수": 90, "민수": 85, "영희": 80}

 

# keys

keys = scores.keys()

for k in keys:

    print(k)

 

# values

values = scores.values()

for v in values:

    print(v)

dict의 items()는 Dictonary의 키-값 쌍 Tuple 들로 구성된 dict_items 객체를 리턴한다. 참고로 dict_items 객체를 리스트로 변환하기 위해서는 list()를 사용할 수 있다. 이는 dict_keys, dict_values 객체에도 공히 적용된다.

scores = {"철수": 90, "민수": 85, "영희": 80}

 

items = scores.items()

print(items)

# 출력: dict_items([('민수', 85), ('영희', 80), ('철수', 90)])

 

# dict_items를 리스트로 변환할 때

itemsList = list(items)

dict.get() 메서드는 특정 키에 대한 값을 리턴하는데, 이는 Dictionary[키]를 사용하는 것과 비슷하다. 단, Dictionary[키]를 사용하면 키가 없을 때 에러(KeyError)를 리턴하는 반면, get()은 키가 Dictionary에 없을 경우 None을 리턴하므로 더 유용할 수 있다. 물론 get()을 사용하는 대신 해당 키가 Dictionary에 존재하는지 체크하고 Dictionary[키]를 사용하는 방법도 있다. 키가 Dictionary에 존재하는지를 체크하지 위해서는 멤버쉽연산자 in 을 사용하면 된다.

scores = {"철수": 90, "민수": 85, "영희": 80}

v = scores.get("민수")  # 85

v = scores.get("길동")  # None

v = scores["길동"]      # 에러 발생

 

# 멤버쉽연산자 in 사용

if "길동" in scores:

    print(scores["길동"])

 

scores.clear()  # 모두 삭제

print(scores)

dict.update() 메서드는 Dictionary 안의 여러 데이타를 한꺼번에 갱신하는데 유용한 메서드이다. 아래 예제에서 처럼, update() 안에 Dictionary 형태로 여러 데이타의 값을 변경하면, 해당 데이타들이 update() 메서드에 의해 한꺼번에 수정된다.

persons = [('김기수', 30), ('홍대길', 35), ('강찬수', 25)]

mydict = dict(persons)

 

mydict.update({'홍대길':33,'강찬수':26})

 

4. Set

4-1 Set은 중복이 없는 요소들 (unique elements)로만 구성된 집합 컬렉션이다. Set은 Curly Brace { } 를 사용하여 컬렉션을 표현하는데, 내부적으로 요소들을 순서대로 저장하기 않기 때문에, 순서에 의존하는 기능들을 사용할 수 없다. 만약 set을 정의할 때, 중복된 값을 입력하는 경우, set은 중복된 값을 한번만 가지고 있게 된다. 리스트나 튜플 등을 set으로 변경하기 위해서는 set() 생성자를 사용한다. 이는 리스트에 중복된 값들이 있을 때, 중복 없이 Unique한 값만을 얻고자 할 때 유용하다.

# set 정의

myset = { 1, 1, 3, 5, 5 }

print(myset)    # 출력: {1, 3, 5}

 

# 리스트를 set으로 변환

mylist = ["A", "A", "B", "B", "B"]

s = set(mylist)

print(s)        # 출력: {'A', 'B'}

4-2. Set에서의 추가 및 삭제

Set에 하나의 새로운 요소를 추가하기 위해서는 set 클래스의 add() 메서드를 사용하고, 여러 개의 요소들을 한께번에 추가하기 위해서는 update() 메서드를 사용한다. 또한 Set에서 하나의 요소를 삭제하기 위해서는 remove() 혹은 discard() 메서드를 사용하고, 전체를 모두 지우기 위해서는 clear() 메서드를 사용한다.

myset = {1, 3, 5}

 

# 하나만 추가

myset.add(7)

print(myset)

 

# 여러 개 추가

myset.update({4,2,10})

print(myset)

 

# 하나만 삭제

myset.remove(1)

print(myset)

 

# 모두 삭제

myset.clear()

print(myset)

4-3. 집합 연산

수학에서 두개의 집합 간의 연산으로 교집합, 합집합, 차집합이 있는데, set 클래스는 이러한 집합 연산 기능을 제공한다. 즉, a와 b가 set 일 때, 교집합은 a & b (혹은 a.intersection(b)), 합집합은 a | b (혹은 a.union(b)), 차집합은 a - b (혹은 a.differene) 와 같이 구할 수 있다.

a = {1, 3, 5}

b = {1, 2, 5}

 

# 교집합

i = a & b

# i = a.intersection(b)

print(i)

 

# 합집합

u = a | b

# u = a.union(b)

print(u)

 

# 차집합

d = a - b

# d = a.difference(b)

print(d)

 

'개발 > python' 카테고리의 다른 글

파이썬 크롤링을 통한 시집 만들기(2편)  (0) 2019.07.18
파이썬 크롤링을 통한 시집 만들기(1편)  (0) 2019.07.18
파이썬 - 문자열  (0) 2019.06.09
파이썬 연산자  (0) 2019.06.06
파이썬 기본데이터 타입  (0) 2019.06.06

관련글 더보기

댓글 영역