자료구조와 알고리즘, 수학, 통계학

자료구조 기초 정리 01. 튜플/딕셔너리/세트의 정의, 리스트의 활용

책다니엘 2024. 2. 24. 03:12

1. 여러 개의 데이터가 묶여 있는 자료형을 컨테이너 자료형이라고 하고, 이러한 컨테이너 자료형의 데이터 구조를 자료구조라고 한다.

2. 자료구조는 각각의 컨테이너 자료형에 따라서 차이가 있으며, 파이썬에서는 대표적으로 리스트(List), 튜플(Tuple), 딕셔너리(Dic), 세트(Set)가 있다. 

 

3. 튜플은 리스트와 거의 같지만, 한 번 데이터가 정해지면 바꿀 수가 없다

4. 딕셔너리는 키와 값 쌍으로 이뤄짐

5. 셋은 리스트/튜플과 비슷하지만, 중복된 데이터가 허용되지 않음

 

6. 리스트는 배열과 같이 여러 개의 데이터를 나열한 자료구조이다. 중복 허용, 데이터 수정 가능

7. '[]'를 이용해 선언하고, 데이터 구분은 ','를 이용한다.

8. 숫자, 문자(열), 논리형 등 모든 기본 데이터를 같이 저장할 수 있다. 

9. 리스트에 또 다른 컨테이너 자료형 데이터를 저장할 수도 있다.

10. 리스트 아이템은 인덱스를 이용해서 조회한다.

arr = [ '유재석', '김종국', '하하', '전소민', '양세찬', '이광수' ] 일 경우
arr[0] = '유재석'
arr[1] = '김종국'
...

 

11. 리스트 길이란 리스트에 저장된 아이템 갯수를 뜻한다.

arr = [ '유재석', '김종국', '하하', '전소민', '양세찬', '이광수' ] 일 경우
len(arr) = 6

 

12. 반복문( for i in range(len(arr)): ~ ) 을 통해 리스트의 아이템 조회가 가능하다.

13. len()함수는 리스트의 아이템 뿐만 아니라 문자열의 길이도 알 수 있다.

14. for item in arr: ~ 와 같은 방식으로 arr 안의 아이템의 값을 item로 선언하는 방식으로 참조할 수도 있다.

15. for문을 활용하여 리스트 안에 있는 리스트의 값을 조회할 수도 있다.

studentCnts = [[1,19], [2,20], [3,22],[4,18],[5,21]]
for classNo, cnt in studentCnts:
    print(f'{classNo}학급 학생 수: {cnt}')
    
# 1학급 학생 수: 19
# 2학급 학생 수: 20
# 3학급 학생 수: 22
# 4학급 학생 수: 18
# 5학급 학생 수: 21

 

16. while문을 활용하여 리스트 안에 있는 값을 조회할 수 있다.

studentCnts = [[1,19], [2,20], [3,22],[4,18],[5,21]]
n = 0
while n<len(studentCnts):
    print(f'{studentCnts[n][0]}학급 학생 수: {studentCnts[n][1]}')
    n+=1

# 1학급 학생 수: 19
# 2학급 학생 수: 20
# 3학급 학생 수: 22
# 4학급 학생 수: 18
# 5학급 학생 수: 21


studentCnts = ['유재석', '김종국', '하하', '전소민', '이광수']
n = 0
while n<len(studentCnts):
    print(f'{studentCnts[n]}')
    n += 1

# 유재석
# 김종국
# 하하
# 전소민
# 이광수

 

17. enumerate() 함수를 활용하여 아이템을 '열거'할 수 있다.

studentCnts = ['유재석', '김종국', '하하', '전소민', '이광수']
for idx, value in enumerate(studentCnts):
    print(f'{idx} : {value}')

# 0 : 유재석
# 1 : 김종국
# 2 : 하하
# 3 : 전소민
# 4 : 이광수

 

18. enumerate()함수는 문자열에도 적용할 수 있다.

studentCnts = 'Hello World!'
for idx, value in enumerate(studentCnts):
    print(f'{idx} : {value}')

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

 

19. append()함수를 이용하면 리스트의 '맨 뒤에' 아이템을 추가한다.

20. insert()함수를 이용하면 특정 위치(인덱스)에 아이템을 추가한다.

studentCnts = ['유재석', '김종국', '하하', '전소민', '이광수']
studentCnts.insert(3, '양세찬')\

for idx, student in enumerate(studentCnts):
    print(f'{idx} : {student}')
    
# 0 : 유재석
# 1 : 김종국
# 2 : 하하
# 3 : 양세찬
# 4 : 전소민
# 5 : 이광수

 

21. pop()함수를 사용하면 리스트의 '맨 마지막' 아이템을 삭제한다.

22. pop(n)함수를 사용하면 리스트의 'n번째' 아이템을 삭제한다.

studentCnts = ['유재석', '김종국', '하하', '전소민', '이광수']

studentCnts.pop(3)

for idx, student in enumerate(studentCnts):
    print(f'{idx} : {student}')

# 0 : 유재석
# 1 : 김종국
# 2 : 하하
# 3 : 이광수

 

23. remove()함수를 사용하면 특정 아이템을 삭제한다.

studentCnts = ['유재석', '김종국', '하하', '전소민', '이광수']

studentCnts.remove('하하')

for idx, student in enumerate(studentCnts):
    print(f'{idx} : {student}')

# 0 : 유재석
# 1 : 김종국
# 2 : 전소민
# 3 : 이광수

 

24. extend()함수를 사용하면 리스트에 또 다른 리스트를 확장(연결)할 수 있다.

students = ['유재석', '김종국', '하하', '전소민', '이광수']
students2 = ['정준하', '박명수', '정형돈', '조세호']

students.extend(students2)

for idx, student in enumerate(students):
    print(f'{idx} : {student}')

# 0 : 유재석
# 1 : 김종국
# 2 : 하하
# 3 : 전소민
# 4 : 이광수
# 5 : 정준하
# 6 : 박명수
# 7 : 정형돈
# 8 : 조세호


# 두 리스트를 + 산술연산자로 더해도 같은 결과가 나온다.

students = ['유재석', '김종국', '하하', '전소민', '이광수']
students2 = ['정준하', '박명수', '정형돈', '조세호']

result = students + students2

for idx, student in enumerate(result):
    print(f'{idx} : {student}')

# 0 : 유재석
# 1 : 김종국
# 2 : 하하
# 3 : 전소민
# 4 : 이광수
# 5 : 정준하
# 6 : 박명수
# 7 : 정형돈
# 8 : 조세호

 

25. sort()함수를 사용하면 리스트 내의 아이템을 정렬할 수 있다.

students = ['유재석', '김종국', '하하', '전소민', '이광수']
students2 = ['정준하', '박명수', '정형돈', '조세호']

result = students + students2
result.sort(reverse=True) # 내림차순 정렬

for idx, student in enumerate(result):
    print(f'{idx} : {student}')

# 0 : 하하
# 1 : 조세호
# 2 : 정형돈
# 3 : 정준하
# 4 : 전소민
# 5 : 이광수
# 6 : 유재석
# 7 : 박명수
# 8 : 김종국

 

26. reverse()함수를 이용하면 아이템 순서를 뒤집을 수 있다.

students = ['유재석', '김종국', '하하', '전소민', '이광수']
students2 = ['정준하', '박명수', '정형돈', '조세호']

result = students + students2
result.sort(reverse=True) # 내림차순 정렬

for idx, student in enumerate(result):
    print(f'{idx} : {student}')

# 0 : 하하
# 1 : 조세호
# 2 : 정형돈
# 3 : 정준하
# 4 : 전소민
# 5 : 이광수
# 6 : 유재석
# 7 : 박명수
# 8 : 김종국

result.reverse()

for idx, student in enumerate(result):
    print(f'{idx} : {student}')

# 0 : 김종국
# 1 : 박명수
# 2 : 유재석
# 3 : 이광수
# 4 : 전소민
# 5 : 정준하
# 6 : 정형돈
# 7 : 조세호
# 8 : 하하

 

27. [n:m]의 방식으로 리스트 안에서 n <= 인덱스 < m인 값만 뽑아낼 수 있다. 이를 리스트 슬라이싱이라고 한다.

students = ['유재석', '김종국', '하하', '전소민', '이광수']
students2 = ['정준하', '박명수', '정형돈', '조세호']

result = students + students2

for idx, student in enumerate(result[2:5]):
    print(f'{idx} : {student}, 리스트 안에서의 인덱스: {result.index(student)}')

# 0 : 하하, 리스트 안에서의 인덱스: 2
# 1 : 전소민, 리스트 안에서의 인덱스: 3
# 2 : 이광수, 리스트 안에서의 인덱스: 4

 

28. 슬라이싱할 때 [n:m]에서 n이나 m을 -n/-m으로 마이너스 표기하면, 뒤에서부터 센다.

students = ['유재석', '김종국', '하하', '전소민', '이광수']
students2 = ['정준하', '박명수', '정형돈', '조세호']

result = students + students2

for idx, student in enumerate(result[-7:5]):
    print(f'{idx} : {student}, 리스트 안에서의 인덱스: {result.index(student)}')

# 0 : 하하, 리스트 안에서의 인덱스: 2
# 1 : 전소민, 리스트 안에서의 인덱스: 3
# 2 : 이광수, 리스트 안에서의 인덱스: 4

 

29. 슬라이싱할 때 단계를 설정할 수 있다. [n:m:l] 처럼 표기하면, n <= 인덱스 < m 만큼의 리스트를 슬라이싱하여 l단위로 건너뛰어 출력한다.

students = ['유재석', '김종국', '하하', '전소민', '이광수']
students2 = ['정준하', '박명수', '정형돈', '조세호']

result = students + students2

for idx, student in enumerate(result[2:7:2]):
    print(f'{idx} : {student}, 리스트 안에서의 인덱스: {result.index(student)}')

# 0 : 하하, 리스트 안에서의 인덱스: 2
# 1 : 이광수, 리스트 안에서의 인덱스: 4
# 2 : 박명수, 리스트 안에서의 인덱스: 6

 

30. 슬라이싱으로 아이템을 변경할 수도 있다.

students = ['유재석', '김종국', '하하', '전소민', '이광수']
students2 = ['정준하', '박명수', '정형돈', '조세호']

result = students + students2
result[2:7:2] = ['Haha', 'Lee Gwang Soo', 'Park Myung Soo']

for idx, student in enumerate(result):
    print(f'{idx} : {student}')

# 0 : 유재석
# 1 : 김종국
# 2 : Haha
# 3 : 전소민
# 4 : Lee Gwang Soo
# 5 : 정준하
# 6 : Park Myung Soo
# 7 : 정형돈
# 8 : 조세호

 

31. slice()함수를 사용해서 아이템을 슬라이싱할 수 있다.

students = ['유재석', '김종국', '하하', '전소민', '이광수']
students2 = ['정준하', '박명수', '정형돈', '조세호']

result = students + students2

for idx, student in enumerate(result[slice(2,5)]):
    print(f'{idx} : {student}, 리스트 내에서의 인덱스: {result.index(student)}')

# 0 : 하하, 리스트 내에서의 인덱스: 2
# 1 : 전소민, 리스트 내에서의 인덱스: 3
# 2 : 이광수, 리스트 내에서의 인덱스: 4

 

32. 리스트를 곱셈 연산하면 아이템이 반복된다.

students = ['유재석', '김종국', '하하', '전소민', '이광수']

for idx, student in enumerate(students * 2):
    print(f'{idx} : {student}')

# 0 : 유재석
# 1 : 김종국
# 2 : 하하
# 3 : 전소민
# 4 : 이광수
# 5 : 유재석
# 6 : 김종국
# 7 : 하하
# 8 : 전소민
# 9 : 이광수

 

33. index()함수를 통해 아이템의 위치를 알아낼 수 있다.

34. count()함수를 통해 특정 아이템의 갯수를 알아낼 수 있다.

students = ['유재석', '김종국', '하하', '전소민', '이광수', '유재석', '이광수', '유재석']

print(f'"유재석"이라는 값의 갯수는: {students.count('유재석')}')

# "유재석"이라는 값의 갯수는: 3

 

35. del()함수를 사용하면 특정 아이템을 삭제할 수 있다.

students = ['유재석', '김종국', '하하', '전소민', '이광수']
students2 = ['정준하', '박명수', '정형돈', '조세호']

result = students + students2

del result[0]

for idx, student in enumerate(result):
    print(f'{idx} : {student}')
    
# 0 : 김종국
# 1 : 하하
# 2 : 전소민
# 3 : 이광수
# 4 : 정준하
# 5 : 박명수
# 6 : 정형돈
# 7 : 조세호