AI학습 4일차

이유진·2024년 1월 19일

1. 리스트(list)

  • 여러가지 데이터타입의 데이터를 ,콤마로 구분하여 []로 감싼 구조

classroom = input('수강생들의 나이를 입력하세요:(쉼표포함)').split(',')
print(classroom)

리스트 만드는 방법1

list1 = [1,3,5,7,9]
print(list1)
print(type(list1)) # 리스트도 하나의 타입이다.

리스트를 만드는 방법2

list()함수 사용

list2 = list([1,2,3,4,5]) # 튜플, 딕셔너리 등등 다른 배열을 list로 만들어줄 때 사용함.
print(list2)

#문자만 가지고 만들어보기
list3 =['이유진','이지민','용호중','안민혁','이세찬']
print(list3)

여러가지 데이터 타입을 섞어서 만들어보기

list4 = ['이유진',25, 174.1, True]
print(list4)

여러가지 타입을 담을 수 있는 리스트에 특성상

요소로써 저장할 수 있다.

list5 = [1, 3.14, ['이유진','배고파']]
print(list5)

print(list5[2][0])

2. 리스트 인덱싱

list1 = [1,3,5,7,9]
print(list1, '\n')

인덱싱 하는 방식은 문자열과 동일하다.

print(list1[2])

리스트 인덱싱한 결과는 하나의 독립적인 값으로 봐야한다.

그렇기에 데이터 타입에 맞게 연산도 가능하다.

print(list1[-1] + 40)

list5 = [1, 3.14, ['이유진','배고파']]
print(list5,'\n')

print(list5[2][0]+list5[2][1])

list6 = [1,3,5,['이유진','이지민','용호중',['이제','그만','보자']]]

'그만' 뽑기

print(list6[3][3][1])

  1. 리스트의 슬라이싱

문자열 슬라이싱과 같다

list7 = [10, 20, 30, 40, 50]
print(list7)

print(list7[0:3])
print(list7[-3:])

4.리스트 연산자

list8 = [10,20,30]
list9 = [100,200]

리스트끼리의 덧셈 연산은 연결!

print(list8 + list9)
#print(list8 - list9) # TypeError: unsupported operand type(s) for -: 'list' and 'list'
#print(list8 / list9) #TypeError: unsupported operand type(s) for /: 'list' and 'list'
#print(list8 * list9) #TypeError: can't multiply sequence by non-int of type 'list'

리스트오 정수의 연산은 가능!

정수만큼 반목해준다.

print(list8 *3)

5.리스트의 수정/삭제

list9 = [10,20,30]

list9[1] = 2222
print(list9)

list10 = [10,20,30]
list11 = [10,20,30]

인덱싱을 사용해서 값을 수정

list11[1] = [55,66,77]
print(list11)

슬라이싱을 사용해서 값을 수정

list10[1:2] # 슬라이싱을 통해 값을 추출하게 되면 list타입으로 출력한다.
list10[1:2] = [55,66,77]
print(list10)

위 두가지의 차이를 한번 눈에 담아주자.

삭제

슬라이싱을 이용한 삭제

list11 = [10,20,30]

list11[1:3] = []

print(list11)

위에 방식을 인덱싱을 이용해서 한다면?

list11[1:3] = []
print(list11)

위에 방식을 인덱싱을 이용해서 한다면?

list10[1]=[]
print(list10) # 비어있는 '',"",[] 등등 다 값으로 볼줄 알아야한다. 공집합으로 생각하자.

del 키워드를 사용하여 삭제하기

del list10[1]
print(list10)

del과 슬라이싱의 콜라보

list12= [1,2,3,4,5,6]
del list12[2:5]
print(list12)

6.참고 : 얕은 복사와 깊은 복사

  • 얕은복사 : 주소 복사
  • 깊은복사 : 데이터 복사

temp1 = [10,20,30,40,50] # 굉장히 중요 아래 코드는 얕은복사.
temp2 = temp1 # temp1의 저장소에 값이 저장이 되는게 아니라 값은 RAM에 따로 저장이 되고 temp1이 그 값의 주소를 할당하고 있고 temp2도 그 주소를 할당하고 있다.

실제 주소가 아닌.

파이썬에서 관리하는 고유 코드

print('temp1의 주소 : ',id(temp1))
print('temp1의 주소 : ',id(temp2))

temp2[2] = 9999 # 따라서 temp2의 값이 바뀌면 temp1의 값도 바뀌는것.

print('temp1 : ',temp1)
print('temp2 : ',temp2)

temp1에 데이터가 담겨있는 것처럼 보이지만 실제로는 주소값만 가지고 있다.

그렇기 때문에 temp2 = temp1 을 하게되면 값이 아닌, 해당 주소값을 넣어주는 것이다.

그래서 두 변수 모두 같은 주소를 참조하고 있기 때문에 하나의 값만 수정해도 둘 다 바뀐다.

깊은 복사 예시

temp3 = [1,2,3,4,5,6]
temp4 = temp3.copy()
temp4[1] = []

실제 주소가 아닌.

파이썬에서 관리하는 고유 코드

print('temp1의 주소 : ',id(temp3))
print('temp1의 주소 : ',id(temp4))

print(temp3)
print(temp4)

참고

test = [10,20,30,[40,50,60]]
temp = test.copy()

print(temp)
print('temp1의 주소 : ',id(test))
print('temp1의 주소 : ',id(temp))

print('temp1 내부 리스트의 주소 : ',id(test[-1]))
print('temp1 내부 리스트의 주소 : ',id(temp[-1]))

import copy
test2 = [10,20,30,[40,50,60]]
temp2 = copy.deepcopy(test2)

print('\n\n')
print('temp2의 주소 : ',id(test2))
print('temp2의 주소 : ',id(temp2))

print('temp2 내부 리스트의 주소 : ',id(test2[-1]))
print('temp2 내부 리스트의 주소 : ',id(temp2[-1]))

copy() 함수는 내부 리스트의 요소를 복사해준다.

리스트의 요소에 리스트가 있다는 것은

값이 아닌 요소가 되는 리스트의 주소가 저장되어있는 것이다.

그렇기 떄문에 deepcopy() 함수를 사용해서.

내부 리스트가 얕은 복사되는 것을 방지할 수 있다.

7.리스트 함수

list13 = [10,20,30]
print(list13)

값 추가하기

list13[3] = 55

append() : 리스트 마지막 자리에 데이터를 추가

list13.append(40)
print(list13)

리스트도 하나의 값이기때문에 리스트 타입의 값이 추가됨.

list13.append([50,60])
print(list13)

list13.append(10,20) # append()함수는 꼭 하나의 요소만 추가가능.

list13.append([10,20,[30.40]])
print(list13)

리스트의 삭제

list14 = [10,20,30,40,50]
print(list14)

pop() : 리스트 마지막에 저장된 데이터를 반환하고 해당 데이터는 삭제

print('삭제된 값 : ',list14.pop())
print(list14)

매개변수로 인덱스를 전달하면 해당 인덱스의 데이터 삭제

print('삭제된 값 : ',list14.pop(1))
print(list14)

list15 = [10,20,30,40,50,20,40,20,20]

remove() : 매개변수로 전달된 데이터를 제거

같은 데이터가 여러개 있는 경우 처음 출현하는 데이터를 삭제

list15.remove(20) # 얘는 pop과 다르게 반환하지 않음.(출력x)
print(list15)

삭제할 데이터가 없다면 에러 발생.

리스트의 요소 삽입

list16 = [11,22,33,44]

insert() : 리스트의 특정 위치(인덱스)에 데이터를 삽입

list16.insert(1,49)
print(list16)
list16.insert(-1,49) # 만약 마지막에 값을 추가하고싶다면 append를 사용한다. # R코드 처럼 insert는 마지막 공백의 인덱스 즉 5를 입력해도 사용가능.(인덱스번호 +1 가능 그러나, append 추천)
print(list16)

인덱스번호 생략 불가능!!!!

리스트의 정렬

list17 = [10,40,30,100,90,50,20]

sort() 메소드 : 리스트에 저장된 데이터를 오름차순, 내림차순으로 정렬

내가 접근한 리스트를 정렬하고 수정까지!!! sort는 메소드이다.

list17.sort()
print(list17)

앞 뒤 역전

list17.reverse()

print(list17)

list17.sort(reverse=True)
print(list17)
print('\n')
list18 = ['Apple','Banana','banana','watermelon','Orange']
list18.sort() # 제일 앞글자를 기준으로 정렬하고 우선순위는 대문자가 더 높다!
print(list18)
print('\n')
list19 = ['이유진','이지민','용호중','안민혁','이세찬']
list19.sort(reverse=True)
print(list19)

print('\n\n')

tempc = sorted(list17,reverse=True)
print(tempc)

list20 = ['이유진','이지민','용호중','안민혁','이세찬']

sorted() 함수 : 원본 데이터는 수정하지 않고, 정렬된 리스트를 반환

sorted(list20, reverse = True)

정렬된 리스트를 계속 사용하고 싶다면 저장공간(변수)에 저장한다.

result = sorted(list20,reverse=True)

print(result)

리스트 요소의 갯수 구하기

len()

print(len(list20))

for i in range(len(list15)):

if 20 in list15 :

list15.remove()

else :

continue

for i in range(5):
if 20 in list15:
list15.remove()
else :
continue

print(list15)

--7.튜플.ipynb--

1.튜플(Tuple)

  • 리스트와 비슷하지만 리스트는 [ ]로 자료를 감싸고

  • 튜플은 ( )로 감싼다.

  • 요소의 수정 삭제 불가능!!!!!!!

tu1 = ()
print(type(tu1))
print(tu1)

tu2 = (1,2,3,4)
print(tu2)

tu3 = 1,2,3,4 # ( )생략가능
print(tu3)

튜플도 여러가지 자료형을 담을 수 있다.

tu4 = (1,3.14,'이유진',True,('튜플도.','된다'))
print(tu4)

tu5 = (1,3.14,'이유진',True,['리스트도.','된다'])
print(tu5)

인덱싱과 슬라이싱 리스트와 전부 동일!

print(tu5[-1])
print(tu5[0:3])

2.튜플의 수정 및 삭제

tu6 = (1,2,'apple','mandarin')

수정 안됨 ypeError: 'tuple' object does not support item assignment

tu6[1] = 49

삭제도 안됨 TypeError: 'tuple' object doesn't support item deletion

del tu6[1]

del tu6 # 튜플 자체는 삭제 가능

tu7 = (1,3.14,'이유진',True,['리스트도.','된다'])

tu7[-1][-1] ='수정'
print(tu7)

수정이 되는 이유는 튜플에 요소를 수정하는것이 아닌 주소값 즉 튜플에 있는 리스트를 수정하기때문에 가능. 그 주소가 튜플값이라면 불가능.

튜플의 -1번째 인덱스는 값이 아니라 주소가 요소이다.

주소를 바꾸는 게 아니라 그 주소안에 있는 리스트의 요소를 바꾸는것.

tuple.append() # 튜플은 추가 기능 자체가 없다. append 자체가 안되는것!

3.튜플의 연산

tu8 = (1,2,'이유진','류지헌')
tu9 = (49,66)

list1 = [888,999]

덧셈(연결)

print(tu8 + tu9)

print(tu9+list1) # TypeError: can only concatenate tuple (not "list") to tuple 튜플과 리스트는 연결 불가능

tu10 = tuple(list1)
print(tu10)

print('\n튜플과 리스트의 덧셈을 할 때 타입을 맞춰주자.')
print(tu9 + tuple(list1))

곱셈(반복)

print(tu9 * 3)

요소의 갯수

print(len(tu9))

tu11 = (1,3,2,0)

tu11.sort() sort 메소드는 튜플에 존재하지 않음.

print(sorted(tu11)) # sorted는 튜플이든 리스트든 안에있는 요소를 뽑아내서 리스트로 만들어주는 것.

profile
독해지자

3개의 댓글

comment-user-thumbnail
2024년 1월 19일

보기가 너무 어려워요

1개의 답글