[6장] 파이썬 자료구조_리스트
리스트
- 리스트는 항목들을 저장하는 컨테이너로서 그 안에 항목들이 순서를 가지고 저장된다.
- 리스트는 어떤 타입의 항목이라도 저장할 수 있다.
리스트_이름 = [요소1, 요소2, ... ]
temps = [28, 31, 33, 35, 27, 26, 25] #초기값을 가진 리스트를 생성한다.
e = temps[3] #대괄호를 사용하여 요소에 접근한다.
리스트 인덱스
- 인덱스란 리스트에서의 항목의 위치(번호)이다.
- 0부터 시작한다.
- 음수 인덱스는 리스트의 끝에서부터 매겨진다.

- 인덱스를 사용할 때는 인덱스가 적정한 범위에 있는지를 항상 신경써야 한다.
리스트 방문
- index를 이용하여 방문
temps = [28, 31, 33, 35, 27, 26, 25]
for i in range(len(temps)):
print(temps[i], end=',')
#end=' ' 사이에 무언가를 입력하게되면,
#첫번째 출력문과, 두번째 출력문 사이에 end에 넣어준 문자열이 출력된다.
- 리스트를 이용하여 방문
temps = [28, 31, 33, 35, 27, 26, 25]
for i in temps:
print(i, end=',')
zip() 함수
zip() 함수는 2개의 리스트를 받아서 항목 2개를 묶어서 제공한다.
questions =['name','quest','color']
answers =['Kim','파이썬','blue']
for q, a in zip(questions, answers):
print(f"What is your {q}? It is {a}")

리스트에 항목 추가하기 append(item)
append(item)은 항목 item을 리스트의 끝에 추가한다.
heroes = [ ] # 공백 리스트를 생성한다.
heroes.append("아이언맨") # 리스트에 ”아이언맨“을 추가한다.
heroes.append("토르") # 리스트에 ”토르“를 추가한다.
print(heroes)

리스트에 항목 추가하기 insert(index, item)
insert(index, item)는 index 위치에 항목 item을 추가. 즉, 리스트의 중간에 항목을 추가할 수 있다. index 위치에 항목이 추가되면 기존에 있던 index위치부터의 항목들은 뒤로 밀려나가며 인덱스 번호가 1씩 증가한다.
리스트 탐색하기 .index()
index(x)는 리스트에서 ‘x’라는 값이 리스트 상에서 어느 위치에 있는지 그 인데스 값을 알려준다.
heroes = [ "아이언맨", "토르", "헐크", "스칼렛 위치", "헐크" ]
if "헐크" in heroes:
print(heroes.index("헐크"))
리스트에 똑같은 항목이 여러개가 있다면 탐색값은 어떻게 나올까? 위의 코드를 컴파일해보면 2가 나온다. 즉, 더 작은 인덱스 값이 나온다.
탐색할 때 오류를 발생시키지 않으녀면
heroes = [ "아이언맨", "토르", "헐크", "스칼렛 위치", "헐크" ]
n = heroes.index("헐크", 3) #리스트중 3번째 위치부터 처음 '헐크'가 위치한 자리
# n은 4가 된다.
리스트에 항목 삭제하기 .pop(index), .remove(value)
- 항목이 저장된 위치를 알고 있다면 pop(i)을 사용한다.
- 항목의 값만 알고 있다면 remove(value)를 사용한다.
heroes = [ "아이언맨", "토르", "헐크" ]
heroes.remove("토르")
만약 삭제하고자 하는 항목이 없다면 오류가 발생된다. 그렇기에 확인후 삭제한다.
if "토르" in heroes:
heroes.remove("토르")
리스트 연산 정리

리스트 항목의 최대값과 최소값
max()와 min()은 내장 함수로서 거의 모든 객체에 사용 가능
values = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
min(values) # 1
max(values) # 10
리스트 정렬
- .sort() : 리스트의 항목들을 오름차순으로 정렬, reverse옵션 true는 내림차순 정렬
a = [ 3, 2, 1, 5, 4 ]
a.sort() # [1, 2, 3, 4, 5]
a =[3,2,1,5,4 ]
a.sort(reverse=True) # [5, 4, 3, 2, 1
- sorted(리스트) : 인자로 넘어온 객체의 원래 순서를 건드리지 않고 정렬된 원소들을 새로운 객체에 담아서 반환
>>> nums = [3, 5, 2, 1, 4]
>>> sorted_nums = sorted(nums)
>>> print(nums)
[3, 5, 2, 1, 4]
>>> print(sorted_nums)
[1, 2, 3, 4, 5]
리스트 메소드 정리


리스트에서 랜덤으로 선택하기 random.choice()
import random
numberList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print("랜덤하게 선택한 항목=", random.choice(numberList))
리스트 합병과 복제
heroes1 = [ "아이언맨", "토르" ]
heroes2 = [ "헐크", "스칼렛 위치" ]
avengers = heroes1 + heroes2
# avengers는 ['아이언맨', '토르', '헐크', '스칼렛 위치']가 된다.
numbers = [ 1, 2, 3, 4 ] * 3 # 리스트는 [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]이다.
리스트의 자료형이 다를 경우에 합병과 복제를 할 때에는
리스트 비교
리스트와 리스트를 비교할 때, 요소들이 기초자료형이 아니고 사용자가 정의한 객체인 경우에는 , 사용자가 객체 안에 == 연산과 ≠연산을 정의하여야 한다.
list1 = [ 1, 2, 3 ]
list2 = [ 1, 2, 3 ]
print(list1 == list2) # True
list1 = [ 3, 4, 5 ]
list2 = [ 1, 2, 3 ]
print(list1 > list2) # True
리스트 복사하기
- 얕은 복사
temps = [28, 31, 33, 35, 27, 26, 25]
values = temps

- 깊은 복사 : list()는 리스트 객체의 생성자이다. 객체를 생성하고 초기화하는 함수로 다른 객체들을 받아서 리스트로 변환함.
temps = [28, 31, 33, 35, 27, 26, 25]
values = list(temps)

슬라이싱
리스트[ start : stop ]
numbers = [10, 20, 30, 40, 50, 60, 70, 80, 90]
sublist = numers[2:7]
#sublist = [30, 40, 50, 60, 70]
- 시작과 끝 인덱스는 생략이 가능하다.
numbers[:3] # [10, 20, 30]
numbers[3:] # [40, 50, 60, 70, 80, 90]
numbers[:] # [10, 20, 30, 40, 50, 60, 70, 80, 90]
new_numbers = numbers[:] #깊은복사가 된다.
고급 슬라이싱
리스트[ start : stop : step ]
numbers = [10, 20, 30, 40, 50, 60, 70, 80, 90]
sublist = numers[2:7:2]
#sublist = [30, 50, 70]
- 리스트를 역순으로 만드는 법
>>> numbers = [ 10, 20, 30, 40, 50, 60, 70, 80, 90 ]
>>> numbers[:: -1]
[90, 80, 70, 60, 50, 40, 30, 20, 10]
- 리스트 일부 변경
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> lst[0:3] = ['white', 'blue', 'red']
>>> lst
['white', 'blue', 'red', 4, 5, 6, 7, 8]
- 리스트의 항목들 사이에 99를 추가한다.
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> lst[::2] = [99, 99, 99, 99]
>>> lst
[99, 2, 99, 4, 99, 6, 99, 8]
- 리스트의 모든 요소를 삭제한다.
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> lst[:] = [ ]
>>> lst
[]
리스트 변경
del list(index) : 리스트의 특정 요소 삭제
numbers = list(range(0, 10)) # 0에서 시작하여 9까지를 저장하는 리스트
print(numbers)
del numbers[-1] # 마지막 항목을 삭제한다.
print(numbers)

문자열과 리스트
문자열은 문자들이 모인 리스트라고 생각할 수 있다.
s = "Monty Python"
print(s[0]) # M
print(s[6:10]) # Pyth
print(s[-12:-7]) # Monty

#6 리스트 슬라이싱
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- 리스트 슬라이싱 만을 이용하여 리스트의 요소들의 순서를 거꾸로하면서 하나씩 건너뛰기
print(numbers[::-2])
print(numbers[9:0:-2])
#print(numbers[9:0:1])

- 리스트 슬라이싱 만을 이용하여 첫번째 요소만을 남기고 전부 삭제할 수 있는가?
numbers[1:] = [ ]
print(numbers)
불변 객체가 함수로 전달되면
변경이 불가능한 객체는 값으로 전달된다고 볼 수 있다. (call by value) 객체의 참조 값이 함수의 매개 변수로 전달되지만 함수 안에서 객체의 값을 변경하면 새로운 객체가 생성되기 때문이다.
def func1(x):
x = 42 #새로운 객체가 생성된다.
print( "x=",x," id=",id(x))
y = 10
func1(y)
print( "y=",y," id=",id(y))


리스트가 함수로 전달되면
def func2(list):
list[0] = 99
values = [0, 1, 1, 2, 3, 5, 8]
func2(values)
print(values) #변경된다.


리스트 함축
리스트 = [수식 for (변수 in 리스트) if (조건) ]
squares = [x*x for x in range(10) ]
squares = []
for x in range(10):
squares.append(x*x)
- 리스트 함축에는 if를 사용하여 조건이 추가될 수 있다.
squares = [x*x for x in range(10) if x%2==0 ]
2차원 리스트
- 2차원 리스트 == 2차원 테이블
- 리스트의 리스트로 구현된다.

- 실제로는 동적으로 2차원 리스트를 생성하는 경우가 더 많다.
# 동적으로 2차원 리스트를 생성한다.
rows = 3
cols = 5
s = [ ]
for row in range(rows):
s += [[0]*cols] # 2차원 리스트끼리 합쳐진다.
print("s =", s)

- 주의할점
# 동적으로 2차원 리스트를 생성한다.
rows = 3
cols = 5
s = [ ]
for row in range(rows):
s += [0]*cols # 1차원 리스트끼리 합쳐진다.
print("s =", s)

rows = 3
cols = 5
s = [ ([0] * cols) for row in range(rows) ]
print("s =", s)

2차원 리스트 요소 접근
s = [ [ 1, 2, 3, 4, 5 ] ,
[ 6, 7, 8, 9, 10 ],
[11, 12, 13, 14, 15 ] ]
# 행과 열의 개수를 구한다.
rows = len(s) #3
cols = len(s[0]) #5
for r in range(rows):
for c in range(cols):
print(s[r][c], end=",")
print()

2차원 리스트를 함수로 넘기기
2차원 리스트도 함수로 전달할 수 있다. 함수 안에서는 2차원 리스트의 차원을 추출할 수 있다. 2차원 리스트를 s라고 하면 len(s)는 행의 개수이고 len(s[0])는 열의 개수이다.
def sum(numbers) :
total = 0
for i in range(len(numbers)) :
for j in range(len(numbers[0])) :
total = total + numbers[i][j]
return total
2차원 리스트와 리스트 함축
matrix = [i for i in range(5)] for_in range(6)]
print(matrix)

matrix = [[0, 0, 0], [1, 1, 1], [2, 2, 2]]
result = [num for row in matrix for num in row]
print(result)
