Python

[6장] 파이썬 자료구조_리스트

제이지연 2022. 10. 6. 15:26

리스트

  • 리스트는 항목들을 저장하는 컨테이너로서 그 안에 항목들이 순서를 가지고 저장된다.
  • 리스트는 어떤 타입의 항목이라도 저장할 수 있다.
리스트_이름 = [요소1, 요소2, ... ]

temps = [28, 31, 33, 35, 27, 26, 25]        #초기값을 가진 리스트를 생성한다.
e = temps[3]     #대괄호를 사용하여 요소에 접근한다.

 

리스트 인덱스

  • 인덱스란 리스트에서의 항목의 위치(번호)이다.
  • 0부터 시작한다.
  • 음수 인덱스는 리스트의 끝에서부터 매겨진다.
  • 인덱스를 사용할 때는 인덱스가 적정한 범위에 있는지를 항상 신경써야 한다.

 

리스트 방문

  1. index를 이용하여 방문
temps = [28, 31, 33, 35, 27, 26, 25] 
for i in range(len(temps)):
	print(temps[i], end=',')

#end=' ' 사이에 무언가를 입력하게되면, 
#첫번째 출력문과, 두번째 출력문 사이에 end에 넣어준 문자열이 출력된다.
  1. 리스트를 이용하여 방문
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

 

리스트 정렬

  1. .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
  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

 

리스트 복사하기

  1. 얕은 복사
temps = [28, 31, 33, 35, 27, 26, 25] 
values = temps
  1. 깊은 복사 : 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]
  1. 리스트 슬라이싱 만을 이용하여 리스트의 요소들의 순서를 거꾸로하면서 하나씩 건너뛰기
print(numbers[::-2])
print(numbers[9:0:-2])
#print(numbers[9:0:1])
  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)