코딩 노트

04-1 리스트와 반복문 본문

Python

04-1 리스트와 반복문

newbyeol 2021. 4. 22. 12:04

0. 시작하기 전에 리스트란...?

파이썬에서 리스트의 의미는 여러가지 자료를 저장할 수 있는 자료이다. 지금까지 활용한 숫자나 문자, 수식 등이 개별적인, 독립적인 '자료' 였다면 리스트는 이러한 자료들을 모아서 사용할 수 있게 해주는 특별한 형태의 자료를 말한다.

 

리스트는 아래와 같이 대괄호[] 내부에 여러 종류의 자료를 넣어 선언한다.

그리고 쉼표로 자료를 구분해서 입력하고 대괄호[] 내부에 넣는 자료를 요소(element)라고 한다.

>>> array = [273, 32, 103, "문자열", True, False]
>>> print(array)
[273, 32, 103, "문자열", True, False]

 

리스트는 한 가지 자료형만으로 구성할 수도 있고, 여러 종류의 자료형으로 구성할 수도 있다.

대괄호[] 안에 들어간 숫자를 인덱스(index)라고 부른다. 

 

# 리스트 범위 선택
>>> list_a = [273, 32, 103, "문자열", Ttue, False]
>>> list_a[0]
273
>>> list_a[1:3]
[32, 103]

# 리스트 특정 요소 변경
>>> list_a = [273, 32, 103, "문자열", Ttue, False]
>>> list_a[0] = "변경"
>>> list_a
['변경', 32, 103, '문자열', True, False]

list_a[1:3]의 [1:3]은 문자열 범위 선택 연산자처럼 1번째 글자부터 3번째 글자를 선택하는 것이 아니라 그 앞에 숫자,

2번째 글자까지 선택한다. 그래서 결과가 [32, 103] 이 출력된다.

 

특정요소도 변경할 수도 있는데 위와 같이 입력하면 "변경"이라는 문자열을 0번째에 대입하여 요소를 변경할 수 있다.

 

리스트는 위와 같은 일반적인 사용법 외에도 다양하게 사용할 수 있는 방법이 세 가지 있다.

 

첫쨰, 대괄호 안에 음수를 넣어 뒤에서부터 요소를 선택할 수 있다.

>>> list_a = [273, 32, 103, "문자열", Ttue, False]
>>> list_a[-1]
False
>>> list_a[-3]
'문자열'

 

둘쨰, 리스트 접근 연산자를 다음과 같이 이중으로 사용할 수 있다.

>>> list_a = [273, 32, 103, "문자열", Ttue, False]
>>> list_a[3]
'문자열'
>>> listt_a[3][0]
'문'

 

셋째, 리스트 안에 리스트를 사용할 수 있다.

>>> list_a = [[1,2,3],[4,5,6],[7,8,9]]
>>> list_a[1]
[4,5,6]
>>> list_a[1][1]
5

1. 리스트 연산자: 연결(+), 반복(*), len()

· 리스트 연산자

#리스트를 선언합니다.
list_a = [1,2,3]
list_b = [4,5,6]
#출력합니다.
print("# 리스트")
print("list_a=", list_a)
print("list_b =", list_b)
print()

#기본 연산자
print("# 리스트 기본 연산자")
print("list_a + list_b=", list_a + list_b)
print("list_a * 3=", list_a * 3)
print()

#함수
print(" 길이 구하기")
print("len(list_a) =", len(list_a))

2행과 3행은 list_a 와 list_b에 리스트를 선언한다. 7과 8행은 선언된 리스트를 출력하고, 13행에서는 문자열 연결 연산자 + 를 사용해 list_a 와 list_b의 자료를 연결한다 14행에서는 문자열 반복 연산자 *를 사용해 list_a 자료를 3번 반복한다.

len()함수는 괄호 내부에 문자열을 넣으면 문자열의 글자수(=길이)를 세어 주지만, 리스트 변수를 넣으면 요소의 개수를 세어 준다. 19행은 list_a 에 들어있는 요소의 개수를 구한다.

 

2. 리스트에 요소 추가하기: append, insert

# append() 함수
리스트명.append(요소)

#insert() 함수
리스트명.insert(위치, 요소)

 

· 리스트에 요소 추가하기

#리스트를 선언합니다.
list_a = [1,2,3]

#리스트 뒤에 요소 추가하기
print("#리스트 뒤에 요소 추가하기")
list_a.append(4)
list_a.append(5)
print(list_a)
print()

#리스트 중간에 요소 추가하기
print("#리스트 중간에 요소 추가하기")
list_a.insert(0,10)
print(list_a)

2행의 실행문은 list_a에 넣을 자료를 선언한다. append() 함수는 현재의 리스트 뒤쪽에 요소를 추가하는 것이므로,

6행이 실행되면 lsit_a에는 4가 추가되고 7행이 실행되면 5가 추가된다. 

 

그에 반해 13행의 insert() 함수는 괄호 안에서 정해 준 위치에 요소를 삽입하며, 이떼 해당 위치의 요소는 뒤로 하나씩 밀린다. 그 결과 list_a = [10,1,2,3,4,5]가 된다.

 

append() 함수와 insert() 함수는 리스트에 요소 하나를 추가한다 한 번에 여러 요소를 추가하고 싶을 때는 extend() 

함수를 사용한다. extend() 함수는 매개변수로 리스트를 입력하는데, 원래 리스트 뒤에 새로운 리스트의 요소를

모두 추가해준다.

extend() 함수는 마지 append() 함수를 세 번 반복 실행한 효과를 가져온다.

 

· 리스트 연결 연산자와 요소 추가의 차이

리스트 연결 연산자와 extend() 함수는 비슷한 형태로 동작한다. 리스트와 리스트를 연결한다는 기능은 동일한데,

한가지 큰 차이점이 있다.

>>> list_a = [1,2,3]
>>> list_b = [4,5,6]
>>> list_a + list_b # 리스트 연결 연산자로 연결하니
[1,2,3,4,5,6] # 실행결과로 [1,2,3,4,5,6] 이 나왔다
>>> list_a # list_a와 list_b에는 어떠한 변화도 없다(비파괴적 처리)
[1,2,3]
>>> list_b
[4,5,6]

 

리스트 연결 연산자는 연산 결과로 [1,2,3,4,5,6]을 출력하고 있으며, 원본에 어떠한 변화도 없다는 것을 확인할 수 있다.

이어서 extend() 함수를 사용해 보겠다.

>>> list_a = [1,2,3]
>>> list_b = [4,5,6]
>>> list_a.extend(list_b)
>>> list_a
[1,2,3,4,5,6]
>>> list_b
[4,5,6]

리스트 연결 연산자(list_a + list_b)만으로는 list_a에 어떠한 영향도 주지 않는다.

하지만 extend() 함수를 사용하면 list_a에 직접적으로 영향을 준다.

리스트와 같이 원본에 어떠한 영향도주지 않는 것을 비파괴적이라고 표현하고, append(), insert(), extend()함수와 같이

리스트에 직접적인 영향을 주는 함수 또는 연산을 파괴적이라고 표현한다.

 

원래 자료는 비파괴적으로 사용하는 것이 편리하다. 원본도 활용할 수 있고 새로운 결과도 활용할 수 있으므로 선택지가

더 넓기 떄문이다. 그래서 기본적인 모든 것들은 비파괴적으로 작동한다, 하지만 리스트는 용량이 매우 클 수도 있어서 

프로그래밍 언어 입장에서 용량이 얼마나 큰지도 모르는 것을 '원본과 결과'라는 두 가지로 생성하는 것은 위험할 수 

있어 파이썬 프로그래밍 언어는 원본을 직접적으로 조작하는 기능을 제공해서 이러한 위험을 피하는 것이다.

 

어떤 것이 파괴적이고 어떤 것이 피파괴적인 건지 고민이 될 떄는 위와 같이 직접 하나하나 입력해서 원본에 변화가

있는지 없는지 확인하는 것이 좋다

3. 리스트에 요소 제거하기

크게 두 가지로 나뉘는데 인덱스로 제거하기와 값으로 제거하기이다.

 

· 인덱스로 제거하기: del, pop

인덱스로 제거한다는 것은 '리스트의 1번쨰 요소를 제거해 주세요', '리스트의 2번째 요소를 제거해 주세요' 처럼

요소의 위치를 기반으로 요소를 제거하는 것이다. del 키워드 또는 pop()함수를 사용한다.

 

del 키워드는 다음과 같은 구문을 사용하며, 리스트의 특정 인덱스에 있는 요소를 제거한다.

del.리스트명[인덱스]

pop() 함수 또한 제거할 위치에 있는 요소를 제거하는데, 매개변수를 입력하지 않으면 마지막 요소를 제거한다.

리스트명.pop(인덱스)

 

· 리스트 연결 연산자와 요소 추가의 차이

list_a = [0,1,2,3,4,5]
print("# 리스트의 요소 하나 제거하기")

#제거 방법[1] - del
del list_a[1]
print("del list_a[1]:", list_a)

#제거 방법[2] - pop()
list_a pop(2)
print("pop(2):", list_a)

코드를 실행해보면 1번째 요소, 2번쨰 요소가 제거된다. 제거되는 과정을 살펴보자면,

1행을 실행하면 list_a에 자료가 저장된다. 5행의 del 키워드가 가리키는 인덱스가 1번째이므로, 1이 제거되고

[0,2,3,4,5]를 출력한다. 9행에서는 2번째 요소를 제거하라고 했으므로 3이 제거되고, [0,2,4,5]를 출력한다.

미세한 동작 차이가 있지만, 요소를 제거하기 위한 목적으로만 사용되는 경우가 많아서 "pop() 함수를 사용했을 떄는

해당 인덱스의 요소가 출력된다" 등은 무시해도 괜찮다.

 

( pop() 함수의 매개변수에 아무 것도 입력하지 않으면 자동으로 -1이 들어가는 것으로 취급해서 마지막 요소를 

제거한다. )

 

추가로 del 키워드를 사용할 경우에는 범위를 지정해 리스트의 요소를 한꺼번에 제거할 수도 있다. 

[3:6]을 지정하면 마지막 요소를 포함하지 않는다는 것을 명심해야 한다.

 

범위의 한쪽을 입력하지 않으면 지정한 위치를 기준으로 한쪽을 전부 제거해 버릴 수도 있다.  [:3]을 지정하면 3을 기준(3번째 불포함)으로 왼쪽을 모두 제거하고, [3:]을 지정하면 3을 기준으로(3번째 포함) 오른쪽을 모두 제거한다.

· 값으로 제거하기: remove

값으로 제거하는 것은 '리스트 내부에 있는 2를 제거해 주세요' 처럼 값을 지정해서 제거하는 것이다.

이때는 remove() 함수를 사용한다.

리스트.remove(값)
>>> list_c = [1,2,1,2] # 리스트 선언하기
>>> list_c.remove(2) # 리스트의 요소를 값으로 제거하기
>>> list_c
[1,1,2]

remove() 함수는 지정한 값이 리스트 내부에 여러 개 있어도 가장 먼저 발견되는 값 하나만 제거한다.

만약 리스트에 중복된 여러 개 값을 모두 제거하려면 반복문과 조합해서 사용해야 한다.

 

· 모두 제거하기: clear

리스트 내부의 요소를 모두 제거할 때는 clear()함수를 사용한다.

리스트.clear()
>>> list_d = [0,1,2,3,4,5]
>>> list_d.clear()
>>> list_d
[] # 요소가 모두 제거되었습니다.

프로그래밍 언어에서는 내부에 있는 모든 것을 제거할 때 항상 clear라는 이름을 사용한다. 이는 리스트뿐만 아니라

딕셔너리에도 해당되며 웹 개발, 인공지능 개발 등을 할 때도 많이 사용하니 꼭 기억해야 한다.

 

지금까지 살펴보았던 모든 리스트들의 함수들은 파괴적으로 동작한다.

 

3. 리스트 내부에 있는지 확인하기: in/not in 연산자

특정 값이 리스트 내부에 있는지 확인하는 방법은 바로 in 연산자를 활용하는 것이다.

리스트에 내부에 값이 있으면 True, 없으면 False를 출력한다.

>>> list_a = [273, 32, 103, 57, 52]
>>> 273 in list_a
True
>>> 99 in list_a
False

not in 연산자는 리스트 내부에 해당 값이 없는지 확인하는 연산자이다.

(in 연산자를 사용하고 전체를 not으로 감싸는 방법도 사용할 수 있지만 not in 연산자를 사용하는 것이

훨씬 읽기 쉽다)

>>> list_a = [273, 32, 103, 57, 52]
>>> 273 not in list_a
False
>>> 99 in list_a
True

 

3. for 반복문

반복할 작업 내용이 있는 코드를 '복사'하고, 원하는 만큼 '붙여넣기' 하면 된다.

예를 들어 다음 코드는 출력을 다섯 번 반복한다.

print("출력")
print("출력")
print("출력")
print("출력")
print("출력")

하지만 100번, 1000번 또는 무한하게 반복 작업 하고 싶을 때 코드를 계속 붙여넣기 하는 것은 무리가 있으니

이때 반복문을 사용하면 매우 편리하다. 예를 들어 다음 코드는 출력을 100번 반복한다.

for i in range(100):
	print("출력")

(range(100)은 for 반복문과 함께 많이 사용되는 범위 자료형이다.)

 

앞서 나왔던 여러 개의 값을 나타낼 수 있게 해주는 리스트와 같은 자료를 사용해서 반복문을 적용하는 것이 반복문의

기본이다.

 

3. for 반복문: 리스트와 함께 사용하기

for 반복문의 기본 형태는 다음과 같다.

for 반복자 in 반복할 수 있는 것:
	코드

반복할 수 있는 것에는 문자열, 리스트, 딕셔너리, 범위 등이 있다. 리스트와 조합해서 사용해보자면,

#리스트를 선언합니다.
array = [273, 32, 103, 57, 52]

#리스트에 반복문을 적용합니다.
for element in array:
        #출력합니다.
        print(element)

for 반복문은 리스트에 있는 요소 하나하나가 element라는 변수에 들어가며, 차례차례 반복하게 된다.

print() 함수로 element를 출력하므로 리스트의 요소를 차례차례 출력하게 되는 것이다.

 

· for 반복문과 문자열

for 반복문은 문자열을 함께 사용할 수 있다. 문자열을 for 반복문의 뒤에 넣으면 글자 하나하나에 반복이 적용된다.

실행 결과를 보면 어떤 식으로 실행되는지 쉽게 이해할 수 있다.

for character in "안녕하세요":
	print("-", character)

 

'Python' 카테고리의 다른 글

04-3 반복문과 while 반복문  (0) 2021.04.26
04-2 딕셔너리와 반복문  (0) 2021.04.26
03-2 if~else와 elif 구문  (0) 2021.04.20
03-1 불 자료형과 if 조건문  (0) 2021.04.18
02-4 숫자와 문자열의 다양한 기능  (0) 2021.04.17