AI데이터 분석_ 파이썬 기초6(리스트 값 수정, 리스트의 함수, 리스트의 메소드)

2024. 9. 5. 21:15파이썬을 활용한 데이터 분석

문자열 리스트 만들기

문자열 저장 변수  // split()메소드 사용하기

#리스트 수정하는법

#리스트 안의 요소에 접근하기 : 인덱스 번호

li1 = [1,3,5,7,"korea",3.14,True] #리스트는 모든 자료형을 허용한다!
print(li1,type(li1))

li2 = [1,2,[1,2],1,1,[1,2,1,1,1]] #리스트는 중복값을 허용한다!
print(li2[5][4],type(li2[5][4]))


#문자열 ->리스트(문자열을 리스트요소로 만들기)
data= 'hello python'
print(data,type(data))
data1= list(data)
print(data1,type(data1)) #원래 문자열이었던 것을 한글자씩 리스트의 값요소로 출력됨. 공백까지!
print(data1[3],type(data1))

data2 = data.split() #data= 'hello python' 일반 문자열을 split()메소드를 통해 data2라는 변수에 넣음
print(data2,type(data2))#단어로 나뉘어진 형태인데 리스트로 출력이 됨
#split(): 문자열 메소드로 ()안에 있는 것을 공백기준으로 잘라서 리스트로 만들어줌
print(data2[1][0],type(data2[1][0])) #split()사용 후 단어별로 인덱스 번호가 부여되고 그 단어 안에서도 인덱스번호가 따로 부여됨. 리스트안의 리스트값 출력하는법과 동일

print()

 리스트를 먼저 다양한 방법으로 만들어보자. 기본적으로 많이 만드는 방법이외에도 문자열이 저장된 변수를가지고 리스트의 메소드를 이용하면 문자열 리스트를 간단하게 생성할 수 있다. 먼저, 문자열이 저장된 변수를 하나 생성한 후, 문자열을 잘라, 리스트안에 저장해주는 메소드인 .split()을 사용하면된다. split메소드는 괄호안에 아무것도 입력하지 않으면 문자열에서 공백을 기준으로 값을 나눠주며, 특정값으로 나누고싶은 기준이 있다면 그 기준 문자열을 전달하기만 하면된다. 또한, 변수가 저장된 문자열단어 하나하나를 가지고 리스트로 변환하고싶을때는 변수를 list()함수를 사용하여 리스트로 변환해주기만 하면 된다. 

 

문자열 / split()메소드로 리스트만들기 실습

#<실습>
band = '유다빈 밴드'
band1=list(band)
print(band,type(band1)) #리스트로 출력됨
print(band1[3],type(band1[3])) #공백 출력

band2= band.split()
print(band2,type(band2))
print(band2[1][0],type(band2[1][0]))

 

리스트 요소 수정하기

인덱스와 슬라이싱으로 값 수정하기

#리스트 요소에 접근하기


#리스트 안의 요소에 접근하기 : 인덱스 번호

li1=[10,20,30,40,50,60,70,80]
print(li1,type(li1))

print(li1[4],type(li1[4])) #인덱스번호를 사용했기때문에 int로 출력
print(li1[1:4],type(li1[1:4])) #슬라이싱할때 끝번호는 가지고오지 않기때문에 40까지 출력됨
#인덱스는 추출이기때문에 고유의 자료형이 나오고 슬라이싱은 잘라서 가지고오는 것이기때문에 슬라이싱으로 출력됨

li1 = [10,20,30,40,50,60,70,80,90]
print(li1,type(li1))
print(li1[0],type(li1[0])) #인덱스
print(li1[0:3],type(li1[0:3])) #슬라이싱

#인덱스 번호를 활용한 리스트 값 수정
li1[0]=100
print(li1[0],type(li1[0]))
print(li1,type(li1))
li1[8]=900
print(li1,type(li1))

#슬라이싱을 활용하여 리스트 값 수정
li1[0:3]=[1,2,3] #슬라이싱을 활용해서 값을 바꾸고자한다면 무조건 리스트를 사용해야한다
print(li1,type(li1))

li1[::2]=[1,2,3,4,5] #바꾸려는 값과 리스트안의 값의 갯수가 동일해야함. 그렇지 않으면 에러!
print(li1,type(li1))

리스트안의 요소에 접근하기위해서는 인덱스번호를 이용하여 접근하는 방법이 가장 대표적이다. 인덱스 번호로 리스트안의 값에 접근을 한 후, 수정을 하거나 값을 추가하거나 해야한다. 인덱스로 값을 수정하는 방법은, []대괄호를 사용하는 방법인데, 인덱스번호를 사용하여 값에 먼저 접근한다음 =대입연산자를 사용하여 수정해줄 값을 전달하면 된다. 슬라이싱으로 값을 수정하는 방법도 동일하게 []대괄호와 =대입연산자를 사용하여 값을 전달해야하는데 슬라이싱으로 요소에 접근하여 값을 변경하는 경우에는 반드시 리스트를 사용해야한다. 또한, 슬라이싱의 경우에는 바꾸려는 값과 그 리스트안의 값의 갯수가 반드시 동일해야한다.

 

리스트의 함수

#리스트에서 사용가능한 함수
li=[1,3,5,7,9]
print(f"li의 길이:{len(li)}")
print(f"li의 최대값:{max(li)}")
print(f"li의 최소값:{min(li)}")
print(f"li의 합계:{sum(li)}")
print(f"li의 평균:{sum(li)/len(li)}") #나누기는 무조건 실수로 출력

#다른 컬렉션에서도 사용가능!

 

리스트에서 사용할 수 있는 많은 함수들이 있지만, 가장 기본이되면서 가장많이 사용하는 함수 5가지를 알아보자. len은 리스트안의 요소의 개수를 반환해주며, max는 가장 큰값을, min은 가장 작은 값을 반환해준다. 또한 sum은 리스트안의 요소의 개수를 전부 합산한 값을 반환하게되는데, 이런 함수를 사용하여 평균을 구할 수 도 있다.

 

리스트의 메소드

리스트의 값 추가하기(append / insert)

#리스트의 메소드
li=[1,3,5,7,9]
print(li)

#추가 append, insert
#1).append
li.append(10)
print(li) #10이라는 값이 li의 리스트의 맨끝에 추가가 되었음
li.append(11)
print(li)

# li.append(2,4) #에러발생! append는 무조건 값을 한개만 추가할 수 있음

#2)insert
li.insert(1,2) #(인덱스번호, 값)의 형태로 적고 원하는 인덱스 번호에 해당 값을 넣을 수 있음
print(li) #기존 1번 위치에 있던 3이 삭제되는게 아니라 그 뒤로 밀려서 들어감
li.insert(3,4)
print(li)
# li.insert(3,4,5,6) 에러발생! 인덱스도 인덱스번호와 값만 한세트로 들어갈 수 있음! 여러개의 값 전달X

리스트의 값을 추가할때 사용할 수 있는 메소드로는 append와 insert가 있다. append의 사용법은 리스트명.append(추가할값)의 형태로 사용하는데, append의 경우 리스트의 가장 맨 끝에 새로운 값이 추가된다. 또한 append의 경우 무조건 한번 사용할때 1개의 값만을 추가할 수 있다. 

insert의 경우 리스명.insert(인덱스번호, 추가할 값)의 형태로 사용하는데, 해당 인덱스번호에 추가할 값이 삽입되는 형식이다. 하지만 insert의 경우 기존 인덱스번호에 있던 값이 사라지고 새로운 값이 추가되는게 아니라, 기존 인덱스번호에 있던 데이터값이 하나 뒤로 밀리고 그 자리에 새로운 값이 추가되는 것이다. 또한 insert역시 인덱스번호, 값의 한쌍의 형태1개로만 값을 추가할 수 있다.

 

 

리스트의 연결(extend)

#.extend :리스트와 리스트 연결
li2= [10,20]
li3 = [50,70,90]
print(li2+li3,type(li2+li3)) #시퀀즈 자료형이기때문에 +연산자 사용하여 합쳐져서 출력

print(li2) #+연산자를 사용했을때만 합쳐져서 출력되고 li2원본 자체는 변경되지 않음.

li2.extend(li3)
print(li2)#+연산자를 사용했을때와 결과는 같아보이지만 extend()메소드를 사용하면 원본자체가 달라짐
print()

extend는 리스트와 또 다른 리스트를 연결해서 하나의 리스트로 반환해주는 메소드이다. 사실 리스트를 연결할때 리스트는 시퀀스 연산자이기때문에 +를 사용하여 연결 해줄 수 도 있으나, +연산자를 사용하여 리스트를 연결하게 되면 그 출력당시에만 리스트가 연결되고 원본은 변하지 않기때문에 원본까지 변경하는 리스트메소드를 사용해야한다. 

extend메소드는 리스트명.extend(다른 리스트명)의 형태로사용한다.

 

 

리스트 값 삭제하기(remove / pop)

#.remove(값) / pop(idex)
print(li2,type(li2))
li2.remove(50)
print(li2) #remove를 거친 후 50이 삭제가 되어 출력

li3 =[1,2,3,4,1,3,5,7]
print(li3)
li3.remove(1)
print(li3) #리스트안에 있는 수 중에 1이 중복값. remove안에 중복값이 있는 수를 입력하면
#해당 리스트 기준 맨 앞에 있는 수만 삭제함.  [2, 3, 4, 1, 3, 5, 7]로 출력
li3.remove(1)
print(li3) #[2, 3, 4, 3, 5, 7]로 출력. 두번째 있던 1이 사라짐 (리스트안에 1이 없는 상태)
# li3.remove(1)
# print(li3) 에러발생! 리스트안에 지우려는 값이 없기때문

print()

#pop(idex)
li2.pop(0)
print(li2) #0번째 인덱스 번호에위치해있던 10이 삭제되어서 출력!

li3 =[1,2,3,4,1,3,5,7]
li3.pop(2)
print(li3) #인덱스번호 2번째에 있던 3이 삭제되어서 출력
# li3.pop(11) # pop index out of range 해당 리스트에 11번인 인덱스번호가 없기때문에 에러!
li3.pop() #메소드 pop()안에 인덱스 번호 지정해주지않으면 맨 끝값이 삭제됨!
print(li3)

리스트의 요소를 삭제할때는 remove와 pop을 사용하여야한다. 먼저 remove의 경우 리스트.remove(삭제할 값)의 형태로 사용하며, 직접 삭제할 값을 그대로 적어주면된다. 이때 리스트에 존재하지 않는 값이 remove안에 들어가면 삭제할 값이 존재하지 않으므로 에러가 발생한다.

pop은 리스트명.pop(인덱스번호)의 형태로 사용하는데, 해당 인덱스번호를가진 값이 삭제되는 형식이며, 만약 pop에 아무값도 전달하지 않았다면 리스트 요소의 가장 맨끝값이 삭제된다. pop역시 마찬가지로 인덱스값의 범위를 벗어난 인덱스 번호를 적게되면 에러가 발생한다.

 

 

리스트의 정렬(sort, sort(reverse=Ture), reverse)

#리스트의 메소드

#정렬 .sort()  /  .sort(reverse=True) / reverse()
li1 = [1,3,2,5,7,5,6,9,10,11]
print(li1,type(li1))

li1.sort() #이미 .sort앞에 객체를 지정해주었기때문에 괄호안에 아무것도 적지 않음
print(li1) #오름차순으로 정렬되어서 나옴

li1.sort(reverse=True) #.sort()안에 reverse=True라고 적게되면 내림차순으로 정렬하겠다는 뜻!
print(li1) #True를 False로 적으면 오름차순으로 나옴

li2 = ["a","b","c"]
li2.sort(reverse=True)
print(li2) #내림차순으로 c부터 출력!
li2.sort()
print(li2)#다시 오름차순으로 a부터 출력!

li2 = [1,2,3,"a","b","c"]
# li2.sort()
# print(li2)
# 객체.sort() / 객체.sort(reverse=True)는 숫자와 문자를 함께 사용할 수 없음. 문자는 문자끼리, 숫자는 숫자끼리만 사용!

#reverse() : 역순으로 정렬
li2.reverse() #reverse는 그냥 단순 역순출력이기때문에 문자+숫자 조합 사용가능
print(li2) #역순으로 c부터 출력됨

리스트안의 요소를 정렬할때는 sort메소드를 사용한다. sort메소드를 사용한 리스트는 반드시 오름차순으로 정렬되며, 정렬을 사용할때는 리스트안의 요소가 하나의 종류로 통일되어야한다. 만약 리스트의 요소값을 내림차순 하고싶을때는 sort(reverse=True)를 사용하여 내림차순해야한다. 만약 내림차순이나 오름차순 처럼 데이터의 크기가 순서를 결정하는데 영향을 주는것이 아니라, 단순히 역순으로 리스트의 요소를 정렬하고 싶을때는 reverse를 사용한다. reverse의 경우 그냥 나열된 요소들을 역순출력하는 경우이기때문에 요소가 숫자, 문자 등등 함께 사용하는것이 가능하다.

 

 

리스트 요소 삭제(clear , del)

#리스트 전체 삭제. clear()  / del
li2.clear()
print(li2) #리스트안에 있는 요소값 전부 삭제 #빈 리스트를 만드는 메소드!

#del:리스트 자체를 삭제(del은 변수 삭제할때도 사용, 저장공간 삭제할때도 사용->저장공간 자체를 없애줌)
del li2
# print(li2)# not define 으로 출력! del로 리스트를 삭제해주었기때문!

리스트의 요소를 삭제하고싶을떄는 clear()메소드를 사용한다. clear()메소드는 리스트안에 있는 요소값을 전부 삭제하기때문에 빈 리스트를 만들고싶을때도 사용할 수 있는 방법이다. 또한 리스트요소뿐만 아니라 리스트자체를 삭제하고싶을때는 del을 사용한다. del은 리스트 자체를 삭제하기때문에 저장공간확보를 할 수 있으며, del을 사용한 후 리스트를 출력하면 존재하지 ㅇ낳는 리스트이기때문에 당연히 에러가 발생한다.

 


학습일기

이제 메소드 파트까지 도달했다..!! 확실히 메소드의 경우에는 잘 사용하지 않는 메소드는 아직까지도 약간 익숙하지가 않다...특히 index....메소드도 사실 메소드 자체만 사용하는경우보다는 어떻게 활용해서 어떤 값을 추출하느냐가 중요한 부분이기때문에..

조건문, 반복문 등과 같이 사용하며 활용법을 익혀야겠다..!