[파이썬기초] 03. 리스트

1. 리스트

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

1.1 리스트 선언

1.1.1 리스트 선언

  • 리스트를 생성하는 방법은 다음과 같이 대괄호 []에 자료를 쉼표로 구분해서 입력힘
    • 이때 대괄호 내부에 넣는 자료를 요소(element)또는 항목(item)이라고 함
  • 리스트는 한 가지 자료형만으로 구성할 수도 있고, 여러 종류의 자료형으로도 구성할 수 있음
>>>> [1, 2, 3, 4] # 숫자로만 구성된 리스트
[1, 2, 3, 4]
>>>> ['안', '녕', '하', '세', '요'] # 문자열만으로 구성된 리스트
['안', '녕', '하', '세', '요']
>>>> [1234, 'Hello', True, '가나다라', False] # 여러 자료형으로 구성된 리스트
[1234, 'Hello', True, '가나다라', False]
  • 리스트 안에 있는 요소들을 사용하려면 이름과 함께 선언하면 됨
list_a = [1234, 'Hello', True, '가나다라', False]

1.1.2 list()

  • 리스트를 생성할 때 대괄호 내에 해당하는 요소들을 작성할 수도 있지만, list()라는 내장함수를 사용하여도 생성 가능
>>>> list1 = list() # 빈 리스트 생성하기 1
>>>> list2 = [] # 빈 리스트 생성하기 2
>>>> list3 = list(1, 2, 3)
>>>> list3
[1, 2, 3]
>>>> list4 = list(range(1, 10)) # range()함수로부터 리스트 생성
>>>> list4
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>> list5 = list('ABCDEF') # 문자열로부터 리스트 생성
>>>> list5
['A', 'B', 'C', 'D', 'E', 'F']
  • 리스트 내에 리스트를 가지도록 만들 수도 있음
>>>> list6 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>>> list6[1]
[4, 5, 6]
>>>> list6[2][0]
7

1.1.3 range()

  • 위에서 등장한 range()함수는 범위를 지정해야할 필요가 있을 때 주로 사용하는 자료형임
  • 매개변수로는 정수만을 가지며 사용법은 다음과 같음
    • range(A): 0부터 A-1까지의 정수로 범위를 만듦
    • range(A, B): A부터 B-1까지의 정수로 범위를 만듦
    • range(A, B, C): A부터 B-1까지의 정수로 범위를 만드는데, 앞뒤의 숫자가 C만큼의 차이를 가짐

1.2 인덱스

  • 리스트 안의 각각의 요소는 인덱스(index)를 이용해 접근 가능하며, 인덱스는 리스트의 항목 값을 가리키는 숫자를 의미
  • n개의 항목을 가진 리스트의 인덱스는 0부터 n-1까지의 값을 가짐
  • 인덱스를 이용해 자료 값에 접근하는 것을 인덱싱(indexing)이라고 부름
>>>> list_a = [1234, 'Hello', True, '가나다라', False]
>>>> list_a
[1234, 'Hello', True, '가나다라', False]
>>>> list_a[0]
1234
>>>> list_a[2]
True
>>>> list_a[2] = '변경' # 인덱스로 해당 요소의 값을 변경할 수 있음
>>>> list_a
[1234, 'Hello', '변경', '가나다라', False]
  • 인덱스는 음수를 가질 수 있으며, 이는 뒤에서 부터 요소를 참조한다는 의미임
  • 가장 마지막 원소가 인덱스로 -1을 가지고, 가장 첫 번째 원소가 -n의 인덱스 값을 가짐
>>>> list_a[-1]
False
>>>> list_a[-5]
1234
  • 리스트 접근 연산자를 이중으로 사용할 수 있음
>>>> list_a[1][2]
'l'
>>>> list_a[-2][0]
'가'
  • 리스트에서도 IndexError가 발생하는데, 이는 리스트의 길이를 넘는 인덱스로 요소에 접근하려고 할 때 발생
>>>> list_ex = [123, 45, 6789]
>>>> list_ex[3]

Traceback (most recent call last):
	File "<pyshell#3>", line 1, in <module>
IndexError: list index out of range

1.3 슬라이싱(slicing)

  • 리스트 내의 항목을 특정한 구간별로 선택하여 잘라내는 기능
  • 구간을 명시하기 위해 list_name[start:end]로 나타냄
>>>> a_list = [10, 20, 30, 40, 50, 60, 70, 80]
>>>> a_list[1:5] # index 1번부터 5-1번까지의 항목들을 슬라이싱
[20, 30, 40, 50]
>>>> a_list[0:1]
[10]
>>>> a_list[:2] # 처음부터 2-1번 인덱스까지 슬라이싱
[10, 20]
>>>> a_list[1:] # 1번 인덱스부터 끝까지 슬라이싱
[20, 30, 40, 50, 60, 70, 80]
>>>> a_list[:] # 전체를 슬라이싱
[10, 20, 30, 40, 50, 60, 70, 80]
>>>> a_list[-7:-2] # -7번 인덱스(뒤에서 일곱 번 째)부터 -2번 인덱스(뒤에서 두 번 째)전 까지 슬라이싱
[20, 30, 40, 50, 60]
>>>> a_list[-7:] # -7번 인덱스(뒤에서 일곱 번 째)부터 끝까지 슬라이싱
[20, 30, 40, 50, 60, 70, 80]
>>>> a_list[:-2] # 처음부터 -2번 인덱스(뒤에서 두 번 째) 전까지 슬라이싱
[10, 20, 30, 40, 50, 60]
>>>> a_list[-2:] #-2번 인덱스부터 끝까지 슬라이싱
[70, 80]
  • 구간 뒤에 step을 설정하여 step만큼 건너뛰며 슬라이싱도 가능
  • list_name[start:end:step]
>>>> a_list = [10, 20, 30, 40, 50, 60, 70, 80]
>>>> a_list[::-1] # 모든 항목을 역순으로 슬라이싱
[80, 70, 60, 50, 40, 30, 20, 10]
>>>> a_list[1::-1] # 처음의 두 개의 항목을 역순으로 슬라이싱
[20, 10]
>>>> a_list[0:8:3] # 처음부터 8-1번 인덱스 까지 슬라이싱 하되, 스텝을 3으로 설정
[10, 40, 70]

2. 리스트 연산자

2.1 연결(+), 반복(*), len()

  • 문자열 연결 연산자인 +와 동일하며, 단순히 리스트 두 개를 하나의 리스트로 합쳐주는 것을 의미함
  • 문자열 반복 연산자인 *와 동일하며, 해당 리스트의 자료를 해당 횟수 만큼 반복함
  • len() 함수는 괄호 내부에 리스트 변수를 넣으면 요소의 개수를 세어줌
>>>> list1 = [11, 22, 33, 44]
>>>> list2 = [55, 66]
>>>> list1+list2
[11, 22, 33, 44, 55, 66]
>>>> list2 * 3
[55, 66, 55, 66, 55, 66] 
>>>> list1 * list2
TypeError: can't multiply sequence by non-int of type 'list'

2.2 요소 추가 연산자

  • 리스트에 요소를 추가하는 방법으로는 위처럼 연결, 혹은 반복 연산자를 사용하여 추가할 수도 있지만 리스트 메소드를 사용하여서 추가 가능

2.2.1 append(x)

  • 원소 x를 리스트의 끝에 추가하는 메소드
  • list_name.append(element)로 사용
>>>> list_a = [1, 2, 3]
>>>> list_a.append(4)
>>>> list_a.append('Hello')
>>>> list_a
[1, 2, 3, 4, 'Hello']

2.2.2 insult(index, x)

  • 원소 x를 원하는 인덱스에 추가하는 메소드
  • list_name.insule(index, elt)로 사용하며, 해당 인덱스에 요소를 삽입하면, 기존에 있던 요소들은 인덱스가 하나씩 늘어나게 됨
>>>> list_nat = ['KOR', 'USA', 'JAP', 'BEL']
>>>> list_nat.insult(1, 'CHN')
>>>> list_nat
['KOR', 'CHN', 'USA', 'JAP', 'BEL']

2.2.3 extend([x, y, ...])

  • [x, y, ...]와 같은 리스트를 리스트에 삽입하는 메소드
  • append()와는 다르게, 한 번에 여러 요소를 추가하고자 할 때 사용함
>>>> list_abc = ['a', 'b', 'c']
>>>> list_abc.extend(['d', 'e'])
>>>> list_abc
['a', 'b', 'c', 'd', 'e']
>>>> list_abc.append(['f', 'g']) # append를 사용하여 추가하면 리스트 자체가 하나의 요소로 삽입됨
>>>> list_abc
['a', 'b', 'c', 'd', 'e', ['f', 'g']]
  • 2.1에서 본 +와 다른 점은 extend()는 파괴적 처리를 한다는 것임
  • 연결연산자가 아닌 append(), insult(), extend() 메소드는 모두 파괴적 처리를 하는 것을 기억하자
    • 프로그래밍 언어 입장에서 리스트의 크기를 모르는데 원본과 결과라는 두 가지로 생성하는 것은 위험하므로 이와 같은 기능들을 제공하여 위험을 피하는 것
>>>> list_a = [1, 2, 3]
>>>> list_b = [4, 5, 6]
>>>> list_a + list_b
[1, 2, 3, 4, 5, 6]
>>>> list_a # 리스트 연결 연산자로 연결 시 실행결과는 두 리스트가 합쳐진 결과로 나오나, 각각의 리스트는 어떠한 변화도 없음(비파괴적 처리)
[1, 2, 3]
>>>> list_b
[4, 5, 6]
>>>> list_a.extend(list_b) # 실행결과로 아무 것도 출력 X
>>>> list_a # list_a 자체에 직접적인 변화를 볼 수 있음(파괴적 처리)
[1, 2, 3, 4, 5, 6]
>>>> list_b
[4, 5, 6]

2.3 요소 제거 연산자

2.3.1 인덱스로 제거

2.3.1.1 del

  • 요소의 위치를 기반으로 제거하는 방식으로, del키워드 또는 pop()함수를 사용함
  • del 키워드는 다음과 같은 구문을 사용하여 리스트의 특정 인덱스에 있는 요소들을 제거함
    • del list_name[index]
    • index에 슬라이싱을 이용해 범위를 지정하여 요소들을 한꺼번에 제거할 수도 있음
>>>> list_a = [0, 1, 2, 3, 4, 5]
>>>> del list_a[1] # 1번 인덱스의 요소 제거
>>>> list_a
[0, 2, 3, 4, 5]
>>>> del list_a[3:] # 3번 인덱스부터 끝까지 제거
>>>> list_a
[0, 2, 3]
>>>> del list_a[:2] # 처음부터 2-1번째 인덱스까지 제거
>>>> list_a
[3]

2.3.1.2 pop()

  • pop()함수 또한 제가할 위치에 있는 요소들을 제거하는데, 매개변수를 입력하지 않으면 마지막 요소를 제거함
    • 이때, 특정 위치의 항목을 삭제함과 동시에 이 항목을 반환함
    • list_name.pop(index)
>>>> list_b = [1, 5, 3, 4, 5, 6]
>>>> list_b.pop()
>>>> 6
>>>> list_b
[1, 5, 3, 4, 5]
>>>> list_b.pop(1)
>>>> 5
>>>> list_b
[1, 3, 4, 5]

2.3.2 값으로 제거

  • 말 그대로 리스트 내부의 특정 값을 지정하여 제거하는 것으로, remove()함수를 사용함
  • 중복되는 값이 있다면 가장 먼저 발견되는 하나만 제거함
    • 만약 리스트 내에 중복된 여러 개의 값을 모두 제거하기 위해서는 반복문과 조합하여 사용해야함
  • 삭제만 수행할 뿐 삭제한 항목을 반환하지 않음 (=> 반목문에서 살펴보자)
>>>> list_c = [1, 2, 3, 4, 5, 4]
>>>> list_c.remove(2)
>>>> list_c
[1, 3, 4, 5, 4]
>>>> list_c.remove(4) # 중복되는 값이 있다면 가장 먼저 발견되는 하나만 제거
>>>> list_c
[1, 3, 5, 4]

2.3.3 모두 제거하기

  • 내부의 요소를 모두 제거할 때는 clear()함수를 사용하여 제거함
>>>> list_d = [0, 1, 2, 3, 4, 5]
>>>> list_d.clear()
>>>> list_d
[]

2.4 멤버 연산자

  • in연산자와 not in연산자로, 특정 값이 리스트 내부에 있는지 확인하는 연산자임
  • 내부에 값이 있으면 True, 없으면 False를 출력함
>>>> list_a = [273, 32, 103, 57, 3660]
>>>> 273 in list_a
True
>>>> 660 in list_a
False
>>>> 1234 not in list_a
True
>>>> 32 not in list_a
False

2.5 비교 연산자

  • ==연산자는 두 리스트의 항목의 값이 모두 같은지를 검사한 후 결과값으로 boolean값을 출력
  • >, >=, <, <= 네 연산자 모두 사전적 순서를 비교하여 결과값으로 불값을 출력함
>>>> list1 = [1, 2, 3, 4]
>>>> list2 = [1, 2, 3, 4]
>>>> list1 == list2
True
>>>> list3 = [2, 3, 4]
>>>> list1 == list3
False
>>>> list1 > list3
False
>>>> list1 < list3
True

이후 추가 예정

3. 리스트 내부 메소드

3.1 기본함수

  • min(), max(), sum()함수는 리스트 내에서 최소, 최대, 합계를 구하는 기본적인 함수임
    • min(), max()의 경우, 숫자가 아닌 문자열의 형태라면 사전적 순서를 비교한 결과를 출력함
    • sum()의 경우, 리스트 내부의 요소가 문자열이라면 동작하지 않음
  • reversed()는 주어진 리스트의 요소의 순서를 뒤집고 싶을 때 사용
    • 매개변수로 리스트를 넣으면 뒤집을 수 있음
  • sorted()는 리스트를 사전식으로 재배열해주는 함수
  • len()은 리스트 내의 항목 개수를 구해주는 내장함수

3.2 메소드

  • index(x)
  • count(x)
  • sort()
  • reverse()
  • 함수와는 달리 메소드는 값을 리턴해주는 것이 아니며, 리스트 자체를 바꿔버리므로 주의

해당 글은 도서 '혼자 공부하는 파이썬'과 학교 강의를 참조하여 작성되었습니다.

좋은 웹페이지 즐겨찾기