Python - LIST[리스트]의 생성, 삭제, 연산, 메서드, 슬라이싱, 인덱싱

이공·2023년 9월 4일
0

파이썬

목록 보기
1/10
post-thumbnail

1. 컬렉션 타입이란?

컬렉션 타입(Collection Types)은 여러 개의 데이터를 하나의 그룹으로 묶어서 다룰 수 있게 해주는 데이터 형식을 나타냅니다. 파이썬에서는 이러한 데이터 형식을 사용하여 여러 데이터를 한 변수에 저장하고 관리할 수 있습니다. 파이썬에서는 리스트, 튜플, 세트, 딕셔너리, 배열 등이 기본적인 컬렉션 타입에 속합니다. 문자열 또한 문자들의 시퀀스로 이루어진 컬렉션 타입입니다.

2. in-place 연산이란?

변수의 값을 직접 변경하거나 수정하는 연산을 가리킵니다. 즉, 원래 변수의 내용을 변경하고 새로운 변수를 생성하지 않는 것을 의미합니다. 이러한 연산은 변수의 메모리 주소를 그대로 유지하며, 메모리 사용량을 줄이고 실행 속도를 향상시키는 데 도움이 됩니다. 함수와 메서드에 자주 등장하니 반드시 알아두시길 바랍니다.

3. 리스트란?

여러 값들을 하나의 변수에 저장하고 관리할 수 있게 해주는 '순차적인' 자료구조입니다. 리스트는 다양한 자료구조를 포함할 수 있으며 확장이 쉽다는 장점이 있습니다. 벡터 연산(원소별 반복) 불가라는 단점이 있습니다.

생성

리스트는 [대괄호]를 사용하여 생성하며, 내부에 포함된 각 항목들은 쉼표로 구분됩니다. list(
)함수를 사용하여 다른 자료구조(df 등)를 list화 할 수 있습니다.

li1 = [1,3,5,7,9] 
li2 = list([1,3,5,7,9]) # 굳이 list로 만드는 이유는 다른 자료구
li3 = ['김사과','반하나','오렌지','이메론']
li4 = [1, 50.5, '김사과', True] # 각자 타입이 다른 데이터를 저장
li5 = [1, 2, '파이썬', ['김사과', '오렌지']]

리스트는 자료구조를 잘 보존한다는 장점이 있습니다.

li5 = [1, 2, '파이썬', ['김사과', '오렌지']]
print(type(li5[0])) #-> <class 'int'>
print(type(li5[2])) #-> <class 'str'>
print(type(li5[3])) #-> <class 'list'>

인덱싱 [num]

인덱스는 방문열고 길찾기라고 생각하면 됩니다. []를 통해 문을 여는거고 숫자로 길을 찾는겁니다.

li1 = [1, 3, 5, 7, 9]
print(li1)
print(li1[0])
print(li1[-1]) # 마지막값
print(li1[0] + li1[-1]) # 인덱스 결과값으로 연산가능

▶ 다중리스트 인덱싱

li2 = ['김사과', '오렌지', '반하나', ['🍕', '🍔', '🍟', '🌭']] #윈도우+. 같이 누르면 이모지 가능
print(li2[0])
print(li2[-1])
print(li2[-1][2])
print(li2[-1][-2])

슬라이싱 :

슬라이싱을 이용하여 리스트 데이터를 추가한 경우 리스트에 데이터만 포함됩니다. 인덱싱하고는 다른 개념입니다.

li1 = [10, 20, 30, 40, 50]
print(li1)
print(li1[0:3]) # 0부터 시작해서 3이 되기 전까지(2)
li3 = [10, 20, 30, ['김사과', '오렌지', '반하나'], 40, ['🍕', '🍔']]
print(li3[2:6])
print(li3[5][:1])
li1 = [10, 20, 30]
li1[1] = 100
print(li1) #->[100, 20, 30]
li2 = [100, 20, 30, 40, 50]
li2[1:2] = ['😎', '😍', '😂']
print(li2) #-> [100, '😎', '😍', '😂', 30, 40, 50]
li2 = [100, 20, 30, 40, 50]
# 인덱싱을 이용하여 리스트 데이터를 추가한 경우 리스트 안에 리스트를 포함(자료구조 보존)
li2[1] = ['😎', '😍', '😂']
print(li3) #->[10, ['😎', '😍', '😂'], 30]

▶ 깊은 복사, 얉은 복사

기본 복사는 얕은 복사(서로 다른 객체 이름을 가지지만 같은 메모리 영역 공유)가 기본값입니다.
아래 코드 실행결과 li1과 li2 모두 0번째 인덱스 값이 100으로 변경되어있습니다.

li2 = li1 # 둘이 같은 메모리를 바라보고 있음
print(li2) #-> [10, 20, 30, 40, 50]
li2[0] = 100
print(li1) #-> [100, 20, 30, 40, 50]
print(li2) #-> [100, 20, 30, 40, 50]

해결방법은 li1의 데이터만 추출해서 복사해 li2만의 메모리공간을 만들어주면 됩니다.

li1 = [10, 20, 30, 40, 50]
li2 = li1[:] # li1의 데이터만 추출해서 복사
print(li2)
li2[0] = 100
print(li1) #->[10, 20, 30, 40, 50]
print(li2) #->[100, 20, 30, 40, 50]

삭제

▶ 슬라이싱과 빈 리스트 활용

li2 = [100, 20, 30, 40, 50]
print(li2[1:3]) #->[20, 30]
li2[1:3] = []
print(li2) #-> [100, 40, 50]
print(li2[1:3]) #->[40, 50]

▶ del과 인덱스 활용

li2 = [100, 20, 30, 40, 50]
del li2[2]
print(li2) #->[100, 20, 40, 50]

연산

li1 = [10, 20, 30]
li2 = [40, 50, 60]
print(li1 + li2) # 리스트 연결연산 [10, 20, 30, 40, 50, 60]
print(li2 + li1) # 리스트 연결연산 [40, 50, 60, 10, 20, 30]

▶ +=

li1 = li1 + [40, 50] # li1 += [40, 50]
print(li1) #-> [10, 20, 30, 40, 50]
li1 = [10, 20, 30]
li1 += [40,50]
print(li1) #-> [10, 20, 30, 40, 50]

▶ 반복

li1 = [10, 20, 30]
print(li1 * 3) #-> [10, 20, 30, 10, 20, 30, 10, 20, 30]
'*' * 5 #-> *****

▶ 타입 오류

int, str 등 연산하고자 하는 데이터의 타입을 잘 파악해야 합니다

li2 = [10,20,30]
print(li2[0]+li2[2])
li2[1] = '😍'
print(li2[0]+li2[1]) # int와 str은 더해지지 않으니 당연히 에러남 TypeError: unsupported operand type(s) for +: 'int' and 'str'

▶ 언패킹

변수들에 할당해줍니다.

apple, banana = ['김사과','반하나']
print(apple) #-> '김사과'
print(banana) #-> '반하나'

함수와 메서드

독립적으로 쓸 수 있는 것을 함수, 리스트뒤에 .을 붙여서 종속적으로 사용가능한 것을 메서드라고 합니다. 메서드는 자료구조 자체가 가지고 있는 기능입니다. 이번 포스트에서는 리스트에 쓸 수 있는 함수와 리스트의 특성과 상호작용하는 리스트의 메서드를 학습하였습니다.

▶ len

'리스트'에 사용되며, 리스트의 끝에 새로운 항목을 하나만 추가하는 메서드입니다.

li1.append(100)
print(li1)
li1.append([200, 300]) #여러개 넣고싶다면 리스트 구조로 넣는데 추가된 값에 자료구조 보존되어 리스트로 들어감
print(li1) #[10, 20, 30, 100, [200, 300]]

▶ extend(리스트)

리스트에 iterable(반복 가능한 객체, 즉 여러개, 순서가 있는 자료객체라는 뜻)의 모든 항목을 추가하는 메서드입니다.

li1.extend([50])
print(li1)
li1.extend([1000, 2000]) #자료구조 보존하지 않고 리스트에 값을 추가

▶ pop(인덱스{default:-1})

리스트에서 항목을 삭제하고, 삭제된 항목을 반환하는 메서드, 삭제가 되며 인플레이스연산이 되어 자동저장됩니다.

print(li1) #-> [10, 20, 30, 40, 50]
print(li1.pop()) #-> 50
print(li1) #-> [10, 20, 30, 40]
li1 = [10, 20, 30, 40, 50]
temp = li1.pop() # temp에 '반환'된 값인 50이 저장
print(temp) #-> 50
print(li1) #-> [10, 20, 30, 40]

▶ insert(인덱스,넣을값)

리스트의 특정 인덱스에 항목을 추가하는 메서드입니다.

li1.insert(1, 100) # 인덱스 1번 위치에 100을 삽입
print(li1) #-> [10, 100, 20, 30]

▶ index(위치알고싶은값)

리스트에서 특정 값의 인덱스를 반환하는 메서드입니다. 특정 값의 인덱스가 없다면 에러가 발생합니다.

li1 = [10, 20, 30, 40, 50]
print(li1.index(100)) #-> 1

▶ reverse()

리스트의 항목들의 순서를 뒤집는 메서드로 in-place되어 자동 저장됩니다.

li1 = ['김사과', '오렌지', '반하나', '이메론']
li1.reverse()
print(li1) #->['이메론', '반하나', '오렌지', '김사과']

▶ 슬라이싱을 사용하여 리스트의 순서를 뒤집는 방법

start를 생략하면 -1로 간주. 즉, 시퀀스의 마지막 요소부터 시작
stop을 생략하면 0으로 간주. 즉, 시퀀스의 시작까지 진행
step이 -1이므로, 시퀀스의 요소를 뒤에서부터 앞으로 하나씩 건너뛰어서 슬라이싱

li1 = ['Apple','apple','orange','banana','melon']
print(li1[::-1]) # 역순출력 -> ['melon', 'banana', 'orange', 'apple', 'Apple']

▶ count(찾는값)

리스트에서 특정 값의 개수를 반환하는 메서드입니다.

li1 = [10, 20, 30, 50, 20, 40, 30, 20]
print(li1.count(20)) # 3
print(li1.count(16)) # 0

▶sort(reverse=False(default))

리스트의 항목들을 정렬하는 메서드입니다. inplace 연산을 수행하여 자동저장됩니다.

li1 = [10, 40, 30, 100, 90, 50]
li1.sort() # 오름차순
print(li1) #-> [10, 30, 40, 50, 90, 100]
# sort(reverse=True) # 내림차순
li1.sort(reverse=True)
print(li1) #-> [100, 90, 50, 40, 30, 10]

▶▶ 알파벳 대소문자 sort

ASCII코드로 문자의 크기를 판단하기에 A가 a보다 작아서 apple이 더 뒤에 위치한 상태로 재저장(in-place)

li2 = ['Apple','apple','orange','banana','melon']
li2.sort() 
print(li2) #->['Apple', 'apple', 'banana', 'melon', 'orange']

▶ sorted와 sort 비교

sorted() : iterable(반복 가능한 객체)의 모든 항목들을 정렬한 후, 그 결과를 새로운 리스트에 담아 반환하는 함수입니다. in-place 연산 수행을 하지 않아 자동저장되지 않습니다.

li1 = [10, 40, 30, 100, 90, 50]
print(sorted(li1)) # 오름차순 [10, 30, 40, 50, 90, 100]
print(li1) #->[10, 40, 30, 100, 90, 50]
print(sorted(li1, reverse=True)) # 내림차순 [100, 90, 50, 40, 30, 10]
print(li1) #-> [10, 40, 30, 100, 90, 50]
profile
인공지능 / 데이터분석

0개의 댓글