데이터 분석/자료구조

자료구조 - 리스트 (list)

김각도 2022. 11. 14. 13:01
반응형

리스트(List)

 자료구조에 대해 하나씩 살펴보자면 먼저, 리스트란 배열과 같이 여러 개의 데이터를 나열한 자료구조이다. []를 이용하여 선언하고, 데이터의 구분은 ‘,’를 이용한다. 리스트 안에는 숫자, 문자, 논리형 등 모든 기본 데이터를 함께 저장할 수 있다. datas = [10, 20, 30, [40, 50, 60]]와 같이 리스트에 또 다른 컨테이너 자료형 데이터를 저장할 수도 있다.

 

인덱스(Index)

 인덱스란 아이템에 자동으로 부여되는 번호표이며, 0부터 시작한다. students[0]과 같이 인덱스를 이용하여 리스트 아이템을 조회할 수 있다. 이때, 인덱스로 조회한 데이터의 타입은 해당 데이터의 종류에 따라 list 타입이 아닌 str, int, float 등으로 나타난다.

 

len()

len()을 이용하면 리스트에 길이를 알 수 있는데, 리스트의 길이란 리스트에 저장된 아이템의 개수를 뜻한다. 리스트의 길이를 모를 경우, 아래와 같이 len()for 반복문을 같이 사용하면 리스트 내의 아이템 개수대로 조회가 가능하다.

 

for I in range(len(students)):

print(‘i : {}’.format(i))

print(‘students[{}] : {}’.format(i, students[i]))

 

len()은 리스트에만 쓰이는 함수가 아닌 문자열의 길이를 조회하는 데에도 쓰인다.

 

반복문과 리스트

앞서 학습했듯이 반복문을 이용하면 리스트의 아이템을 자동으로 참조할 수 있다.

 

# for문과 리스트

cars = [‘그랜저’, ‘소나타’, ‘말리부’]

for I in range(len(cars)):

print(cars[i])

for car in cars:

print(car)

 

# 내부 리스트 조회

studentCnts = [[1, 19], [2, 20], [3, 22], [4, 18]]

for classNo, cnt in studentCnts: # classNo, cnt는 중첩 리스트의 값 변수 선언

print(‘{}번 학급의 학생 수 : {}’.format(classNo, cnt))

 

# for문과 if문을 이용해서 과락 과목 출력하기

minScore = 60

scores = [[‘국어’, 58], [‘영어’, 77], [‘수학’, 89], [‘국사’, 50]]

 

# 인덱스 사용

for item in scores:

if item[1] < minScore:

print(‘과락 과목 : {}, 점수: {}’.format(item[0], item[1]))

 

# 지역 변수 사용

for subject, score in scores:

if score < minScore:

print(‘과락 과목 : {}, 점수 : {}’.format(subject, score))

 

# continue 이용

for subject, score in scores:

if score >= minScore: continue

print(‘과락 과목 : {}, 점수 : {}’.format(subject, score))

 

# while문과 리스트

일반적으로 리스트 내의 아이템을 조회할 때는 for문을 많이 사용하지만, while문으로도 조회할 수 있다.

 

# len()을 이용한 방법

n = 0

while n < len(cars):

print(cars[n])

n += 1

 

# flag를 이용한 방법

n = 0

flag = True

while flag:

print(cars[n])

n += 1

 

if n == len(cars):

flag = False

 

# break를 이용한 방법

n = 0

while True:

print(cars[n])

n += 1

 

if n == len(cars):

break

 

# while문과 중첩 리스트

studentCnts = [[1, 19], [2, 20], [3, 22], [4, 18]]

 

n = 0

while n < len(studentCnts):

print(‘{}학급 학생 수 : {}’.format(studentCnts[n][0], studentCnts[n][1]))

 

# while문과 if문을 이용해서 과락 과목 출력하기

minScore = 60

scores = [[‘국어’, 58], [‘영어’, 77], [‘수학’, 89], [‘국사’, 50]]

 

n = 0

while n < len(scores):

if scores[n][1] < minScore:

print(‘과락 과목 : {}, 점수 : {}’.format(scores[n][0], scores[n][1]))

n += 1

 

# while문과 if문과 continue를 이용해서 과락 과목 출력하기

n = 0

while n < len(scores):

if scores[n][1] >= minScore:

n += 1

continue

print(‘과락 과목 : {}, 점수 : {}’.format(scores[n][0], scores[n][1]))

n += 1

 

 

enumerate() 함수

enumerate() 함수를 이용하면 인덱스를 사용하지 않아도 아이템을 열거할 수 있다. range()와의 차이는 아래와 같다.

 

# for ~ range

for I in range(len(sports)):

print(‘{} : {} ’.format(i, sports[i]))

 

# enumerate()

for idx, value in enumerate(sports):

print(‘{} : {}’.format(idx, value))

 

두 방법은 결과값이 같으며, 후자가 조금 더 간편하고 알아보기가 쉽다. 또한, enumerate()는 아래와 같이 문자열에도 적용할 수 있다.

 

str = ‘Hello’

for idx, value in enumerate(str):

print(‘{} : {}’.format(idx, value))

 

이 코드를 실행시키면 아래와 같은 결과값이 출력된다.

 

0 : H

1 : e

2 : l

3 : l

4 : o

 

append()

append() 함수를 이용하면 리스트의 마지막 인덱스에 아이템을 추가할 수 있다. 괄호 안에 데이터를 넣으면 되고, append([‘수학’, 96])처럼 중첩 리스트 또한 추가할 수 있다.

 

insert()

마지막 인덱스에 값을 추가하는 append()와는 달리 특정 위치에 아이템을 추가하고 싶다면 insert() 함수를 사용하면 된다. 예를 들어 index[3]의 위치에 홍길동이라는 데이터를 추가하고 싶다면, students.insert(3, ‘홍길동’)이라는 코드를 작성하면 된다.

 

pop()

pop() 함수를 이용하면 마지막 인덱스에 해당하는 아이템을 삭제할 수 있다. 만약, 특정 위치의 아이템을 삭제하고 싶다면 students.pop(n)처럼 괄호 안에 삭제할 인덱스의 번호를 넣으면 된다. 이렇게 삭제된 아이템을 변수로서 활용하고 싶다면 value = students.pop()과 같이 변수 선언으로 pop() 함수를 사용할 수 있다.

 

remove()

인덱스 번호를 삭제하는 것이 아닌 특정 아이템을 삭제하고 싶다면 remove() 함수를 사용할 수 있다. 예를 들어 students.remove(‘홍길동’)처럼 괄호 안에 삭제하고 싶은 데이터를 입력해주면 된다. remove()는 한 개의 아이템만 삭제가 가능하다. 만약 삭제하려는 데이터가 중복되어 2개 이상이라면 while문을 이용하여 다음과 같이 홍길동이라는 데이터가 없어질 때까지 모두 삭제할 수 있다.

 

while ‘홍길동’ in students:

students.remove(‘홍길동’)

 

extend()

extend() 함수를 이용하면 리스트에 또 다른 리스트를 연결(확장)할 수 있다. 단순히 덧셈 연산자를 이용하여 연결할 수도 있지만, 조금 차이가 있다. extend() 함수를 이용하여 리스트A와 리스트B를 연결하면, 리스트A에 리스트B가 합쳐진다. 그러나 덧셈 연산자를 이용하면 리스트A와 리스트B가 연결되어 새로운 리스트인 C가 만들어진다. 다만, 그렇게 만들어진 리스트C를 할당 연산자로 리스트A에 할당해줄 수도 있다.

 

sort()

sort() 함수를 이용하면 오름차순으로 아이템을 정렬할 수 있다. 내림차순으로 정렬하고 싶다면 sort(reverse=True), 오름차순을 명시하고 싶다면 반대로 sort(reverse=False)를 이용하면 된다.

 

reverse()

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

 

슬라이싱

슬라이싱이란 [n:m]을 이용하여 리스트 또는 문자열에서 원하는 아이템만 뽑아내는 것이다. , index[n]부터 index[m-1]에 해당하는 아이템까지 뽑아낼 수 있다는 뜻이다. n 또는 m을 생략하여 [:m]의 경우 index[0]부터 index[m-1]까지, [n:]의 경우 index[n]부터 끝까지 아이템을 뽑아낼 수 있다. 만약 n 또는 m이 음수일 경우는 뒤에서부터 인덱스 번호를 적용한다.

[n:m]을 사용하면 한 칸 단위로 아이템을 뽑아내지만, [n:m:x]를 사용하면 단계를 설정하여 x칸 단위로 아이템을 뽑아낸다. 주의할 점은 단계와는 상관없이 index[0]의 데이터부터 시작한다.

슬라이싱을 이용하면 아이템을 변경할 수도 있다. students[1:4] = [‘A’, ‘B’, ‘C’]라는 코드를 실행할 경우 students라는 리스트의 index[1]‘A’라는 데이터로, index[2]‘B’라는 데이터로, index[3]‘C’라는 데이터로 변경된다.

 

slice()

slice() 함수를 이용하면 콜론을 쓰지 않아도 슬라이싱을 할 수 있다. students[slice(n, m)]와 같이 nm을 사용하는 것은 동일하다.

 

리스트의 곱셈 연산

리스트도 곱셈 연산이 가능하다. students * 2를 입력하면 students라는 리스트 내의 아이템이 2번 나열된다. 주의할 점은 리스트가 숫자로 구성되어 있다고 해도 값이 2배가 되는 것이 아닌, 아이템 자체가 2번 나열된다는 것이다.

 

아이템 위치 찾기

index(item) 함수를 이용하면 item의 인덱스 위치를 알아낼 수 있다. 찾는 범위를 지정하고 싶다면, index(item, n, m)을 이용하면 index[n]부터 index[m-1]의 범위 내에 있는 item의 위치를 찾을 수 있다.

 

count()

count() 함수를 이용하여 괄호 안에 아이템을 넣으면 해당 아이템의 개수를 알아낼 수 있다.

 

del 키워드

del 키워드를 이용하면 특정 아이템을 삭제할 수 있다. del students[1]라는 코드는 index[1]에 해당하는 아이템을 삭제한다는 뜻이다. 슬라이싱을 적용하여 del students[n:m]라는 코드를 사용할 수도 있다.

 
반응형

'데이터 분석 > 자료구조' 카테고리의 다른 글

자료구조 - 세트 (set)  (0) 2022.11.16
자료구조 - 튜플 (tuple)  (0) 2022.11.14
자료구조 - 자료형  (0) 2022.11.14