chipkkang9's story

[CodingDojang] 리스트와 튜플 응용하기 본문

Language/Python

[CodingDojang] 리스트와 튜플 응용하기

chipkkang 2022. 2. 23. 18:22

리스트 조작하기

리스트에 요소 추가하기

  • append: 요소 하나 추가
  • extend: 리스트를 연결하여 확장
  • insert: 특정 인덱스에 요소 추가

append(요소)는 리스트 끝에 요소 하나를 추가하는 함수이다. 아래와 같은 방법으로 사용한다.

>>> a = [10, 20, 30]
>>> a.append(500)
>>> a
[10, 20, 30, 500]
>>> len(a)
4

append() 함수는 빈 리스트에 값 추가도 할 수 있다.

 

또한, 리스트 안에 다른 리스트의 추가도 가능하며, 추가된 리스트는 안에 몇 개의 요소가 있든, 하나의 큰 요소로 취급된다.

 

그러면 리스트 끝에 새로운 리스트를 붙이고 싶다면 어떡할까?

extend(리스트) 함수를 이용하면 기존의 리스트 뒤에 새로운 리스트를 이어붙일 수 있다.

>>> a = [10, 20, 30]
>>> a.extend([500, 600])
>>> a
[10, 20, 30, 500, 600]
>>> len(a)
5

또한, 리스트에 원하는 값을 원하는 위치에 삽입할 수 있다.

insert() 함수를 사용하면 되는데, insert(인덱스, 요소)의 형식으로 사용한다.

>>> a = [10, 20, 30]
>>> a.insert(2, 500)
>>> a
[10, 20, 500, 30]
>>> len(a)
4

리스트에서 요소를 삭제할 수도 있다. 아래의 두 가지 방법을 사용할 수 있다.

  • pop() or del(): 마지막 요소 또는 특정 인덱스의 요소를 삭제
>>> a = [10, 20, 30]
>>> a.pop(1)
20
>>> a
[10, 30]

>>> b = [10, 20, 30]
>>> del a[1]
>>> a
[10, 30]
  • remove(): 특정 값을 찾아서 삭제(만약 리스트에 같은 값이 여러 개 있을 경우 처음 찾은 값을 삭제한다.)
>>> a = [10, 20, 30, 20]
>>> a.remove(20)
>>> a
[10, 30, 20]

 지금까지 알아본 리스트의 메서드로 스택과 큐를 만들 수 있다. append와 pop을 사용하면 사실 스택과 100% 일치하는데, 큐는 어떻게 만들까?

 

 여기서 pop()이 아니라, pop(0)과 같은 방법을 사용하면 간단하게 큐를 구현할 수 있다.

 

 파이썬은 큐를 효율적으로 사용할 수 있도록 덱(deque, double ended queue)이라는 자료형을 제공한다. 사용하는 방법은 아래의 코드로 적어놓겠다.

>>> from collections import deque    # collections 모듈에서 deque를 가져옴
>>> a = deque([10, 20, 30])
>>> a
deque([10, 20, 30])
>>> a.append(500)    # 덱의 오른쪽에 500 추가
>>> a
deque([10, 20, 30, 500])
>>> a.popleft()     # 덱의 왼쪽 요소 하나 삭제
10
>>> a
deque([20, 30, 500])

 deque의 append는 덱의 오른쪽에 요소를 추가하고, popleft는 덱의 왼쪽 요소를 삭제한다. 반대로 appendleft는 덱의 왼쪽에 요소를 추가하고, pop으로 덱의 오른쪽 요소를 삭제할 수 있다.

 

 번외로, 알아두면 유용할 것 같은 기능들을 마저 적어놓겠다.

 

 리스트에서 찾고싶은 값의 인덱스로 조회할 수 있는 기능이 있다. 리스트.index(값)으로 조회가 가능하다.

>>> a = [10, 20, 30, 15, 20, 40]
>>> a.index(20)
1

 리스트에 원하는 값이 몇 개 들어있는지를 알 수 있는 기능도 있다. 리스트.count(값)으로 이용할 수 있다.

>>> a = [10, 20, 30, 15, 20, 40]
>>> a.count(20)
2

 리스트에 존재하는 값의 순서를 거꾸로 뒤집는 방법이 존재한다. 리스트.reverse()로 이용할 수 있다.

>>> a = [10, 20, 30, 15, 20, 40]
>>> a.reverse()
>>> a
[40, 20, 15, 30, 20, 10]

 리스트의 요소를 오름차순, 혹은 내림차순으로 정렬할 수도 있다.

  • sort() or sort(reverse=False): 리스트의 값을 작은 순서대로 정렬(오름차순)
  • sort(reverse=True): 리스트의 값을 큰 순서대로 정렬(내림차순)
>>> a = [10, 20, 30, 15, 20, 40]
>>> a.sort()
>>> a
[10, 15, 20, 20, 30, 40]

 리스트를 한 번에 초기화하는 방법도 있다. 리스트.clear()을 사용하면 된다.

>>> a = [10, 20, 30]
>>> a.clear()
>>> a
[]

번외로, 아래의 방법도 있다.

>>> a = [10, 20, 30]
>>> del a[:]
>>> a
[]

리스트 할당과 복사

코드를 먼저 살펴보자.

>>> a = [0, 0, 0, 0, 0]
>>> b = a

위 코드의 의미는 b에 똑같은 리스트를 할당한다는 의미가 아니다.

 

실제로는 [0, 0, 0, 0, 0]이라는 리스트를 a, b 라는 변수들로 조작한다는 의미로, 이 사실을 간과한다면 아래와 같은 사태가 벌어질 수 있다.

>>> b[2] = 99
>>> a
[0, 0, 99, 0, 0]
>>> b
[0, 0, 99, 0, 0]

이때, 리스트의 논리연산자를 사용하면 두 변수는 같다고 나온다.

>>> a is b
True

 그러면 이러한 사태를 일으키지 않으려면 어떻게 할까?

 

 아래와 같은 방법을 사용하면 두 변수가 하나의 리스트를 공유할당하는 사태를 막을 수 있다.

>>> a = [0, 0, 0, 0, 0]
>>> b = a.copy()

그러면, 두 객체는 다르지만 가지고 있는 요소는 같다고 컴퓨터는 인식하며

>>> a is b
False
>>> a == b
True

따라서 어떻게 값을 주는지가 구분된다.

>>> b[2] = 99
>>> a
[0, 0, 0, 0, 0]
>>> b
[0, 0, 99, 0, 0]

리스트 값 출력하기

리스트의 값을 조금 있어보이게 출력하려면 반복문을 이용하여 출력하면 되겠다는 느낌은 온다.

그래서 아래의 코드를 활용하면 처음부터 리스트 끝까지 출력할 수 있다.

>>> a = [38, 21, 53, 62, 19]
>>> for i in a:
...     print(i)
...
38
21
53
62
19

하지만 인간의 욕심은 끝이 없기 때문에 더욱 있어보이게 출력하고 싶어한다.

인덱스와 함께 리스트의 요소들을 출력할 수도 있다.

  • for 인덱스, 요소 in enumerate(리스트): 를 사용하면 리스트와 함께 해당 인덱스 또한 출력할 수 있으며,
>>> a = [38, 21, 53, 62, 19]
>>> for index, value in enumerate(a):
...     print(index, value)
...
0 38
1 21
2 53
3 62
4 19

0부터 시작되는 인덱스가 마음에 들지 않는다면 이런 간단한 방법과

>>> for index, value in enumerate(a):
...     print(index + 1, value)
...
1 38
2 21
3 53
4 62
5 19

이런 파이썬다운 방법이 있다.

>>> for index, value in enumerate(a, start=1):
...     print(index, value)
...
1 38
2 21
3 53
4 62
5 19

for문 말고도 while문을 이용해서 요소를 반복출력해줄 수 있다.

>>> a = [38, 21, 53, 62, 19]
>>> i = 0
>>> while i < len(a):
...     print(a[i])
...     i += 1
...
38
21
53
62
19

리스트의 최대, 최소 요소 구하기

 C언어를 먼저 배우고 파이썬을 공부한다면, 정렬에 대해서 공부할 때 우선 하나의 배열 값을 정해놓고 그보다 큰 값이 들어온다면 큰 값으로 갱신하고, 작은 값이 들어온다면 무시하는 방법으로 최대요소를 구하는 방법을 사용하곤 했을 것이다.

 

 파이썬에서도 같은 방법을 사용하면 최대, 최소 리스트 요소를 구할 수 있는 것은 마찬가지이다.

>>> a = [38, 21, 53, 62, 19]
>>> smallest = a[0]
>>> for i in a:
...     if i < smallest:
...         smallest = i
...
>>> smallest
19

>>> b = [38, 21, 53, 62, 19]
>>> largest = b[0]
>>> for in in b:
...    if i > largest:
...        largest = i
...
>>> largest
62

파이썬에서는 조금 있어보이게 할 수 있지 않을까? 우선, 정렬을 한 후 양 끝값을 구하는 방법이 있을 것이다.

>>> a = [38, 21, 53, 62, 19]
>>> a.sort()
>>> a[0]
19
>>> a.sort(reverse=True)
>>> a[0]
62

 하지만, 최대 최소값을 구하고는 싶지만 리스트의 형태를 건드리기 싫을 때에는 더 간단한 방법이 있다. max(), min() 함수를 사용해주면 된다.

>>> a = [38, 21, 53, 62, 19]
>>> min(a)
19
>>> max(a)
62

 리스트 요소들의 합계를 구할 때에는 어떻게 해야할까? 이 역시 C다운 방법이 있겠지만, 이미 충분히 구현할 수 있을 것 같으니, sum() 함수에 대해서만 소개하도록 하겠다.

>>> a = [10, 10, 10, 10, 10]
>>> sum(a)
50

리스트 표현식 사용하기

C만 배운 나에게는 혁명적인 이야기가 있다. ‘아니 배열 안에서 for문을 돌린다고 물음표느낌표!?’. 아래와 같은 코드도 파이썬에서는 이상한 이야기가 아니다.

>>> a = [i for i in range(10)]        # 0부터 9까지 숫자를 생성하여 리스트 생성
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> b = list(i for i in range(10))    # 0부터 9까지 숫자를 생성하여 리스트 생성
>>> b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

리스트의 요소들을 이렇게 여러 함수와 코드로 작성해줄 수 있으니 재량껏 코드를 작성해 리스트를 만들어 줄 수 있다. 이제 소개할 것들은 큰 설명 없이 쭉 써내려가도록 하겠다.

리스트 표현식 + if문

>>> a = [i for i in range(10) if i % 2 == 0]    # 0~9 숫자 중 2의 배수로 리스트 생성
>>> a
[0, 2, 4, 6, 8]
  • for 반복문과 if 조건문 여러 번
>>> a = [i * j for j in range(2, 10) for i in range(1, 10)]
>>> a
[2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16,
20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36,
42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64,
72, 9, 18, 27, 36, 45, 54, 63, 72, 81]

튜플도 리스트와 사용방법이 매우 유사하므로, 그대로 사용하면 된다.

Comments