[010일차] 리스트와 튜플 / 자료구조 with python

이연희·2023년 8월 16일

Chapter
1. 리스트(List)
(1) 아이템 추가
(2) 아이템 삭제
(3) 리스트 연결
(4) 아이템 정렬
(5) 리스트 슬라이싱
(6) 그외
2. 튜플(Tuple)
(1) 아이템 조회
(2) vs. 리스트
(3) 아이템 정렬

1. 리스트(List)

(1) 아이템 추가

1) append(): 마지막 위치에 아이템 추가

리스트에 append() 이용해서 아이템을 새로 추가할 수 있다. 하나의 아이템 뿐만 아니라, 컨테이너 자료형 데이터 또한 추가할 수 있다.

# 리스트에 아이템 하나 추가하기
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print(f'students: {students}')
print(f'students length: {len(students)}')
print(f'last index: {len(students) -1}')
print('-'*70)

students.append('강호동')
print(f'students: {students}')
print(f'students length: {len(students)}')
print(f'last index: {len(students) -1}')

# 리스트 안에 리스트 추가하기
scores = [['국어',88],['영어',91]]
print(f'scores: {scores}')
print(f'scores length: {len(scores)}')
print(f'last index: {len(scores)-1}')
print('-'*70)

scores.append(['수학',96])
print(f'scores: {scores}')
print(f'scores length: {len(scores)}')
print(f'last index: {len(scores)-1}')

2) insert(index, 아이템): 특정 위치에 아이템 추가

앞서 배운 append()는 아이템을 마지막 위치에만 추가하기 때문에, 특정 인덱스에 아이템을 추가하고 싶다면 insert()를 이용하면 된다.

students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print(f'students: {students}')
print(f'students length: {len(students)}')
print(f'last index: {len(students) -1}')
print('-'*70)

students.insert(3, '강호동')
print(f'students: {students}')
print(f'students length: {len(students)}')
print(f'last index: {len(students) -1}')

(2) 아이템 삭제

1) pop(index)

pop()함수를 이용하면 리스트 안에 있는 아이템을 삭제할 수 있다. pop()안에 인덱스 번호를 입력하면 위치에 주소한 아이템을 삭제할 수 있지만, 번호를 비워두면 자동적으로 가장 마지막 아이템을 삭제하게 된다.

# 리스트에서 '강호동' 데이터 삭제하기
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은', '강호동']
print(f'students: {students}')
print(f'students length: {len(students)}')
print('-'*70)

removeItem = students.pop()
print(f'removeItem: {removeItem}')
print(f'students: {students}')
print(f'students length: {len(students)}')

2) remove(아이템)

pop()함수가 인덱스를 찾아서 아이템을 삭제했다면, remove()함수에는 직접 아이템을 입력하면 특정 아이템을 찾아서 삭제한다.

students = ['홍길동', '박찬호', '강호동', '이용규', '박승철', '김지은', '강호동']
print(f'students: {students}')

removeItem = '강호동'
print(f'removeItem: {removeItem}')
students.remove(removeItem)
print(f'students: {students}')

하지만 리스트에 해당 아이템이 여러 개 들어있어도 remove()함수는 가장 먼저 찾아낸 아이템만 한 번 삭제한다. 따라서 이 경우네는 조건문 등을 이용해서 전부 삭제할 수 있다.

students = ['홍길동', '박찬호', '강호동', '이용규', '박승철', '김지은', '강호동']
print(f'students: {students}')

while '강호동' in students:    # 강호동이 있음 True, 아님 False
    students.remove('강호동')

print(f'students: {students}')

(3) 리스트 연결

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

grp1 = ['홍길동', '박찬호', '이용규']
grp2 = ['강호동', '박승철', '김지은']

print(f'group1: {grp1}')
print(f'group2: {grp2}')
print('-'*70)

grp1.extend(grp2)
print(f'group1 after extend: {grp1}')
print(f'group2: {grp2}')

하지만 extend()를 하게 된다면 원래의 리스트에서 확장된 채로 변경되어 저장되기 때문에 원자료를 해치고 싶지 않다면 그냥 '+' 연산자를 이용해서 새로이 리스트를 변수에 초기화할 수도 있다.

result = grp1 + grp2
print(f'result: {result}')
print(f'group1: {grp1}') 
print(f'group2: {grp2}')

참고로 '+'뿐만 아니라 '*'연산자를 이용해도 리스트를 여러 번 반복할 수 있다.

result = grp1 + grp2
print(f'result: {result}')
print(f'group1: {grp1}')
print(f'group2: {grp2}')

result2 = grp1 * 2
print(f'result2: {result2}')
print('='*70)

(4) 아이템 순서

1) 아이템 정렬

sort()함수를 이용해서 오름차순이나 내림차순으로 아이템들을 정렬할 수 있다.

students = ['홍길동', '박찬호', '이용규','강호동', '박승철', '김지은' ]
print(f'students: {students}')

students.sort()                 # 오름차순
print(f'students: {students}')

students.sort(reverse=True)     # 내림차순
print(f'students: {students}')

2) 아이템 순서 뒤집기

아이템을 정렬하지 않고, 단순히 순서만 뒤집고 싶다면 revers()함수를 이용해서 데이터를 출력할 수 있다.

students = ['홍길동', '박찬호', '이용규','강호동', '박승철', '김지은' ]
print(f'students: {students}')

students.reverse()
print(f'students: {students}')

(5) 리스트 슬라이싱

리스트에서 인덱스 범위를 설정해서 원하는 데이터만 출력할 수 있다. [n:m:a]과 같은 형식을 사용하는데, 이때 범위를 x라고 한다면 n <= x < m 이 된다는 것을 주의해야 한다.
n과 m이 생략되는 저절로 처음부터 혹은 끝까지 인덱스 범위를 설정한다. 또한 n과 m을 음수로 선택할 수 있는데, 이때에는 순서를 리스트의 뒤쪽에서부터 센다. a는 간격이 되는데, a를 생략하면 간격은 자연스럽게 1이 된다.

students = ['홍길동', '박찬호', '이용규','강호동', '박승철', '김지은' ]
print(f'students: {students}')

print(f'students[2:4]: {students[2:4]}')
print(f'studnets[:5] : {students[:5]}')
print(f'studnets[:5:2] : {students[:5:2]}')
print(f'studnets[2:] : {students[2:]}')
print(f'studnets[2:-2] : {students[2:-2]}')     # 음수는 뒤쪽에서 부터
print(f'studnets[-5:-2] : {students[-5:-2]}')     # 음수는 뒤쪽에서 부터

또한 slice(n,m) 함수를 이용하면 앞의 방법처럼 슬라이싱할 수 있다.

students = ['홍길동', '박찬호', '이용규','강호동', '박승철', '김지은' ]
print(f'students: {students}')
print(f'students: {students[slice(2,4)]}') 
print(f'students: {students[slice(4)]}')
print(f'students: {students[slice(2, len(students))]}')
print(f'students: {students[slice(2, len(students)-2)]}')
print(f'students: {students[slice(len(students)-5, len(students)-2)]}')

(6) 그외

1) index(item): 인덱스번호 찾기

index(item)을 이용해서 아이템의 인덱스 번호를 찾을 수 있다.

students = ['홍길동', '박찬호', '이용규','강호동', '박승철', '김지은' ]
print(f'students: {students}')

searchIdx = students.index('강호동')
print(f'searchIdx: {searchIdx}')

그런데 만약, 리스트 안에 동일한 아이템이 여러 개 있다면 index()안에 index(item,시작범위,끝범위)로 지정해서 특정 범위 안에서의 아이템 인덱스 번호를 찾을 수 있다.

students = ['홍길동', '박찬호', '이용규','강호동', '박승철', '김지은', '강호동' ]
print(f'students: {students}')

searchIdx = students.index('강호동',2,5)   
print(f'searchIdx: {searchIdx}')

2) count()

count()함수로 리스트 안에 있는 아이템의 개수를 셀 수 있다.

students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
print(f'students: {students}')

searchCnt = students.count('홍길동')
print(f'searchCnt: {searchCnt}')

searchCnt = students.count('강호동')
print(f'searchCnt: {searchCnt}')

searchCnt = students.count('김아무개')
print(f'searchCnt: {searchCnt}')

3) del 키워드

del 키워드를 이용하면 인덱스 번호를 이용하거나, 앞서 배운 슬라이싱 방법으로 아이템들을 삭제할 수 있다.

students = ['홍길동', '강호동', '박찬호', '이용규', '박승철', '강호동', '김지은']
print(f'students: {students}')

del students[1]
print(f'students: {students}')

del students[1:4]
print(f'students: {students}')

del students[2: ]
print(f'students: {students}')

2. 튜플(Tuple)

튜플은 리스트와 같이 컨테이너 자료형으로, '()'으로 선언할 수 있다. ('()'를 생략해도 선언 가능) 리스트와 마찬가지로 숫자형 뿐만 아니라, 문자형, 논리형 심지어 또 다른 컨테이너 자료형 데이터도 담을 수 있지만 한번 선언하면 데이터를 수정할 수 없다는 특징이 있다.

students = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
print(f'students: {students}')
print(f'students type: {type(students)}')

(1) 아이템 조회

1) 인덱스 조회

튜플에 저장된 데이터를 조회하기 위해서는 인덱스를 이용할 수 있는데, 리스트와 마찬가지로 0부터 그 순서가 시작된다는 것을 조심해야 한다.

students = ('홍길동', '박찬호', '이용규', '박승철', '김지은')

print(f'students: {students}')
print(f'students[0]: {students[0]}')
print(f'students[1]: {students[1]}')
print(f'students[2]: {students[2]}')
print(f'students[3]: {students[3]}')
print(f'students[4]: {students[4]}')

2) 슬라이싱

슬라이싱으로 인덱스 범위를 지정해서 몇 개의 아이템만을 출력할 수 있다.

students = ('홍길동', '박찬호', '이용규','강호동', '박승철', '김지은')
print(f'students: {students}')

print(f'students[2:4]: {students[2:4]}')
print(f'students[:4]: {students[:4]}')
print(f'students[2:]: {students[2:]}')
print(f'students[-2:]: {students[-2:]}')
print(f'students[2:-2]: {students[2:-2]}')
print(f'students[-5:-2]: {students[-5:-2]}')

뿐만 아니라, 리스트 파트에서 배운 slice()함수를 이용해서도 아이템을 조회할 수 있다.

students = ('홍길동', '박찬호', '이용규','강호동', '박승철', '김지은')
print(f'students: {students}')

print(f'students: {students[slice(2,4)]}')
print(f'students: {students[slice(4)]}')
print(f'students: {students[slice(2, len((students)))]}')

3) in, not in 키워드

또한 아이템이 튜플에 존재 유무 자체를 판단하기 위해서 in/not in키워드를 사용할 수 있다.

studentsTuple = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
print(f'studentsTuple: {studentsTuple}')

searchName = input('학생 이름 입력: ')

if searchName in studentsTuple:
    print(f'\'{searchName}\'학생은 우리반 학생입니다.')
else:
    print(f'\'{searchName}\'학생은 우리반 학생이 아닙니다.' )

if searchName not in studentsTuple:
    print(f'\'{searchName}\'학생은 우리반 학생이 아닙니다.' )
else:
    print(f'\'{searchName}\'학생은 우리반 학생입니다.')

참고로 in,not in키워드는 튜플같은 컨테이너 자료형뿐만이 아니라, 일반 문자열같은 자료에서도 사용할 수 있다.

str = 'It\'s sunny day~~~~.'
print(f'str: {str}')
print('{} : {}'.format('\'sunny\' in str', 'sunny' in str))
print('{} : {}'.format('\'Sunny\' in str', 'Sunny' in str))

4) for문과 while문을 이용한 조회

반복문,조건문을 응용하는 방법 등으로도 아이템을 조회할 수 있다.

students = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
print(f'students: {students}')

#1
for i in range(len(students)):
    print(f'students[{i}]: {students[i]}')
print('-'*70)

#2
n = 0
while n < len(students):
    print(f'students[{n}]: {students[n]}')
    n += 1
print('-'*70)

#3
for s in students:
    print(f'students: {s}')

튜플 안에 튜플이 들어있는 자료구조 또한, for문과 while문을 이용해서 참조할 수 있다.

stdntCnts = (1,19), (2,20), (3,22), (4,18), (5,21)
# for문 이용 (1)
for i in range(len(stdntCnts)):
    print(f'{stdntCnts[i][0]}학급 학생 수: {stdntCnts[i][1]}명')
print('-'*70)

# for문 (2)
for classNo, cnt in stdntCnts:
    print(f'{classNo}학급의 학생 수: {cnt}명')

print('-'*70)

# while문
n = 0
while n < len(stdntCnts):
    print(f'{stdntCnts[n][0]}학급 학생 수: {stdntCnts[n][1]}')
    n += 1

(2) vs. 리스트

리스트와 튜플의 가장 큰 차이점 선언할 때 기호의 차이도 있지만, 그보다 두드러지는 것은 튜플이 한번 만들어지면 데이터를 변경할 수 없다는 것이다.

앞서 리스트는 append()나 insert()함수를 이용해서 아이템을 추가하거나, pop(),remove()함수를 이용해서 아이템을 제거하는 것을 배웠다. 하지만 튜플은 데이터 변경이 불가능하니 이런 함수를 모두 쓸 수 없다. 전부 Error가 난다.

하지만, '+'연산자를 이용해서 두 개의 튜플을 결합한 다음 다른 튜플로 정의하거나, list()함수를 이용해서 튜플의 타입을 리스트로 바꾼다면 얼마든지 아이템 추가, 삭제가 가능하다.

# 덧셈 연산을 이용한 튜플 결합
studentTuple1 = ('홍길동', '박찬호', '이용규')
studentTuple2 = ('박승철', '김지은', '강호동')

studentTuple3 = studentTuple1 + studentTuple2
print(f'studentTuple3: {studentTuple3}')

# type변환 후 아이템 추가, 삭제
students = ['홍길동', '박찬호', '이용규','강호동', '강호동']
students = tuple(students)      # 리스트 → 튜플
print(f'students: {students}')
print(type(students))
print('-'*70)

students = list(students)   # 튜플 → 리스트
print(f'students: {students}')
print(type(students))
print('-'*70)

students.pop()
print(f'students: {students}')
students.append('유재석')
print(f'students: {students}')

(3) 아이템 정렬

1) 리스트 변환 후 정렬

마찬가지로 아이템을 변경할 수 없기 때문에, sort()함수를 이용할 수 없다. 그래서 리스트로 변환 후 정렬하는 방법을 사용할 수 있다.

students = ('홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은')
print(f'students: {students}')
print(f'type of students: {type(students)}')

students = list(students)
students.sort()
print(f'students: {students}')
print(f'type of students: {type(students)}')

2) sorted()함수

위의 변환을 함수로 한 번에 할 수 있는데, sorted()함수를 이용하면 튜플을 자동으로 리스트로 바꾼다음 아이템을 정렬하게 된다.

students = ('홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은')
print(f'students: {students}')
print(f'type of students: {type(students)}')

sortedStudents = sorted(students)
print(f'sortedStudents: {sortedStudents}')
print(f'type of sortedStudents: {type(sortedStudents)}')

profile
안녕하세요, 데이터 공부를 하고 있습니다.

0개의 댓글