Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
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
Tags
more
Archives
Today
Total
관리 메뉴

DOing

[Python] List, Tuple, Dictionary, Set 정리 본문

Python

[Python] List, Tuple, Dictionary, Set 정리

mangdo 2021. 4. 26. 21:55

파이썬의 자료형에는 대표적으로 List, Tuple, Dictionary, Set이 있다.

자주 헷갈리기때문에 이번 포스팅을 통해 정리하려고 한다.

추가로 List, Tuple, Dictionary, Set, String 자료형모두 not in, in연산자는 모두 가능하다

 


💡 List

: 순서가 존재한다. (인덱싱 가능)

형태 : a = [1, 2, 3, 4, 5]

 

1. 선언

a = []
b = list()

 

2. 초기화

a = [0]*10

# list comprehension
b = [i for i in range(20) if i% 2 == 1]

특히 2차원 배열의 초기화는 list comprehension을 이용해야한다.

만약 1차원 리스트처럼 초기화한다면 다음과 같은 결과가 나온다.

a[1][1]만 5로 바꾸고 싶었지만 3개의 리스트에서 인덱스 1에 해당하는 원소들이 모두 5로 바뀌었다.

이는 내부적으로 포함된 3개의 리스트가 모두 동일한 객체에 대한 3개의 레퍼런스로 인식되기 때문이다. 따라서 2차원 리스트를 초기화할때는 list comprehension을 사용해야한다.

 

2-1. 2차원 배열의 초기화

a = [[0]*4 for _ in range(3)]

언더바 (_)

 : 변수가 필요없이 반복만 수행하고자 할때 사용한다.

 

3. 인덱싱

인덱스 값을 입력하여 특정한 원소에 접근 하는 것을 인덱싱이라고 한다.

a = [1,2,3,4,5]
print(a[-1])

a[1] = 5
print(a)

출력 결과

5

[5, 2, 3, 4, 5]

 

4. 슬라이싱

연속된 위치를 갖는 원소들을 가져와야할때 콜론(:)을 사용해서 범위 안의 원소들을 가져올 수 있다.

a = [1,2,3,4,5]
print(a[1:3])

출력결과 : [2, 3]

 

5. 메소드

a = [1, 2, 3]

# 맨 뒤에 원소 삽입
a.append(4)

# 오름차순 정렬
a.sort()

# 내림차순 정렬
a.sort(reverse = True)

# 원소 뒤집기
a.reverse()

# 특정 인덱스에 데이터 추가
a.insert(1, 5)

# 특정 인덱스 데이터 삭제
a.del(1)

# 특정값 데이터 삭제
a.remove(1)
a.pop() # 제일 마지막 원소제거
a.pop(1) # index=1인 원소 제거

# 특정 값인 데이터 갯수 세기
a.count(1)

주의해야할 것은 append()의 시간복잡도는 O(1)인 반면, insert()의 시간복잡도는 O(N)이다.

중간에 원소를 삽입한 뒤에 리스트의 원소위치를 조정해줘야하기 때문이다. 따라서 insert()를 남발하면 시간초과가 생길 수 있다. 마찬가지로 remove()나 del()도 삭제후 원소 위치조정이 필요하기 때문에 O(N)이다.

 

remove()는 특정한 값을 갖는 원소를 제거하는데, 값을 가진 원소가 여러개라면 하나만 제거한다. 

특정한 값의 원소를 모두 제거하려면 해당 원소 값을 포함하지않는 새로운 리스트를 생성해야한다. 파이썬에는 다른 언어와 다르게 remove_all()이 존재하지 않는다.

a = [1, 2, 3, 4, 5]
remove_list = [1, 2]
result = [i for i in a if i not in remove_list]

💡 Tuple

: 순서가 존재한다. (인덱싱 가능)

: 한번 선언된 값을 변경할 수 없다.

: 리스트에 비해 공간 효율적이고 잘못된 알고리즘으로 변경되면 안되는 값이 변경되는 것을 방지한다.

형태 : a = (1, 2, 3, 4, 5)

 

💡 Dictionary

: 순서가 없다. (인덱싱 불가)

: 키(key)-값(value)의 쌍을 데이터로 가지는 자료형이다.

: 파이선의 Dictionary자료형은 내부적으로 해시테이블을 사용하므로 데이터의 검색/수정에 있어서 O(1)의 시간에 처리할 수 있다.

> a = dict()
> a['사과'] = 'apple'
> a['바나나'] = 'banana'
> a['코코넛'] = 'coconut'

# 모든 key 얻기
> a.keys()

# 모든 value 얻기
> a.values()

# 모든 key-value쌍 얻기
> a.items()

# key로 value 얻기
> a['사과']

# 특정한 원소가 있는지 검사
if '사과' in data:
	print("사과를 키로가지는 데이터가 존재한다.")

 

💡 Set

: 순서가 없다. (인덱싱 불가)

: 중복을 허용하지 않는다.

: 키가 존재하지 않고 값 데이터만을 담는다.

: Dictionary와 마찬가지로 특정 원소를 검색하는 연산은 O(1)의 시간복잡도를 가진다.

-> 특정한 데이터가 이미 등장한 적있는지 여부를 체크할때 매우 효과적이다.

형태 a={1, 2, 3, 4, 5}

 

1. Set 연산

a = set([1, 2, 3, 4, 5])
b = set([3, 4, 5, 6, 7])

print(a|b) # 합집합
print(a&b) # 교집합
print(a-b) # 차집합

 

2. Set 관련 함수

a = {1, 2, 3}

# 새로운 원소 추가 (시간복잡도:O(1))
a.add(4)

# 새로운 원소 여러개 추가
a.update([5, 6])

# 특정한 값을 갖는 원소 삭제 (시간복잡도:O(1))
a.remove(3)