-> 어떤 위치에 있는 데이터든 한 번에 접근 가능, random access에 유용
# 이름이 arr이고 길이가 6인 정수형 배열
arr=[0,0,0,0,0,0]
arr=[0]*6
arr=list(range(6)) # [0,1,2,3,4,5]
cf) range는 이터레이터로 특정 범위의 정수를 생성하는데 사용
arr=[0 for _ in range(6)] # [0,0,0,0,0]
2차원 배열
# 2차원 배열을 리스트로 표현
arr=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
# arr[2][3]에 저장된 값 출력
print(arr[2][3]) # 12
# arr[2][3]에 저장된 값을 15로 변경
arr[2][3]=15
# 변경된 값을 출력
print(arr[2][3]) # 15
# 크기가 3*4인 리스트를 선언
arr=[[i]*4 for i in range(3)] # [[0,0,0,0],[1,1,1,1],[2,2,2,2]]
배열은 임의 접근으로 모든 위치에 있는 데이터에 단 한 번에 접근 가능
-> 데이터에 접근하기 위한 시간복잡도는 O(1)
맨 뒤에 삽입할 경우 O(1)
맨 앞에 삽입할 경우 O(N) - 한 칸씩 밀어야 하니까
중간에 삽입할 경우 O(N) - 뒤에 있는 데이터 개수만큼 밀어야하니까
-> 배열은 특정한 경우에 데이터 추가나 삭제에 드는 비용이 많음
my_list=[1,2,3]
my_list.append(4) # [1,2,3,4]
my_list=[1,2,3]
my_list=my_list+[4,5] # [1,2,3,4,5]
my_list=[1,2,3,4,5]
my_list.insert(2,9999) # [1,2,9999,3,4,5]
my_list=[1,2,3,4,5]
popped_element=my_list.pop(2) # 3
print(my_list) # [1,2,4,5]
my_list=[1,2,3,2,4,5]
my_list.remove(2) # [1,3,2,4,5]
리스트 컴프리헨션은 기존 리스트를 기반해 새 리스트를 만들거나 반복문,조건문을 이용해 복잡한 리스트를 생성하는 등 다양한 상황에서 사용할 수 있는 문법
연산이 끝난 리스트를 반환할 뿐이지 연산 대상 리스트를 바꾸지는 않음
numbers=[1,2,3,4,5]
squares=[num**2 for num in numbers] # [1,4,9,16,25]
fruits=["apple","banana","cherry","apple","orange","banana","kiwi"]
len(fruits) # 7
fruits.index("banana") # 1
fruits.sort() # ["apple","apple","banana","banana","cherry","kiwi","orange"]
fruits.sort(reverse=True) # 내림차순
fruits.count("apple") # 2