Python List 사용하기 day 3

6 minute read

Unit 22. 리스트와 튜플 응용하기

파이썬의 리스트는 생각보다 기능이 많은데, 요소를 추가/삭제하거나, 정보를 조회하는 메서드(함수)도 제공합니다. 특히 for 반복문과 결합하면 연속적이고 반복되는 값을 손쉽게 처리할 수 있습니다.

리스트에 요소 하나 추가하기

  • append: 요소 하나를 추가
  • extend: 리스트를 연결하여 확장
  • insert: 특정 인덱스에 요소 추가
    >>> a = [10, 20, 30]
    >>> a.append(500)
    >>> a
    [10, 20, 30, 500]
    >>> len(a)
    4
    

리스트의 할당과 복사 알아보기

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

b = a와 같이 리스트를 다른 변수에 할당하면 리스트는 두 개가 될 것 같지만 실제로는 리스트가 한 개입니다

반복문으로 리스트의 요소를 모두 출력하기

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

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

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

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

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

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

>>> a = [38, 21, 53, 62, 19]
>>> i = 0
>>> while i <= len(a):
...     print(a[i])
...     i += 1
...
38
21
53
62
19
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: list index out of range

while i < len(a):
    print(a[i])
    i += 1

리스트의 가장 작은 수, 가장 큰 수, 합계 구하기

앞에서 반복문을 배웠으니 요소를 모두 반복하면서 숫자를 찾아내 보겠습니다.

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

가장 큰 수는 부등호를 반대로 만들면 되겠죠?

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

앞에서 리스트를 정렬하는 sort 메서드를 배웠습니다. 리스트를 작은 순서대로 정렬(오름차순)하면 첫 번째 요소가 가장 작은 수입니다. 반대로 큰 순서대로 정렬(내림차순)하면 첫 번째 요소가 가장 큰 수가 되겠죠?

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

더 간단한 방법이 있습니다. 파이썬에서 제공하는 min, max 함수를 사용하면 됩니다.

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

이번에는 리스트에서 요소의 합계를 구해보겠습니다. 합계를 구할 때도 반복문을 사용할 수 있겠죠?

>>> a = [10, 10, 10, 10, 10]
>>> x = 0
>>> for i in a:
...     x += i
...
>>> x
50

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

리스트 표현식 사용하기

파이썬의 리스트가 특이한 점은 리스트 안에 for 반복문과 if 조건문을 사용할 수 있다는 점입니다. 이렇게 리스트 안에 식, for 반복문, if 조건문 등을 지정하여 리스트를 생성하는 것을 리스트 컴프리헨션(list comprehension)이라고 합니다.

>>> 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]

image

>>> c = [i + 5 for i in range(10)]    # 0부터 9까지 숫자를 생성하면서 값에 5를 더하여 리스트 생성
>>> c
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> d = [i * 2 for i in range(10)]    # 0부터 9까지 숫자를 생성하면서 값에 2를 곱하여 리스트 생성
>>> d
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

대괄호와 list() 리스트 표현식 리스트 표현식은 [식 for 변수 in 리스트]처럼 로 만들 수도 있고, list(식 for 변수 in 리스트)처럼 list로 만들 수도 있습니다. 둘 중에 성능은 대괄호 방식이 더 좋습니다. 특히 list 방식은 C 언어 스타일이라 대괄호 방식이 파이썬 다운 코드입니다. 따라서 리스트 표현식은 대괄호 방식을 사용하는 것이 좋습니다. list는 리스트 표현식을 만들 수 있다는 정도만 알아 두면 됩니다.

image

>>> a = [i for i in range(10) if i % 2 == 0]    # 0~9 숫자 중 2의 배수인 숫자(짝수)로 리스트 생성
>>> a
[0, 2, 4, 6, 8]
>>> b = [i + 5 for i in range(10) if i % 2 == 1]    # 0~9 숫자 중 홀수에 5를 더하여 리스트 생성
>>> b
[6, 8, 10, 12, 14]

리스트 표현식은 for와 if를 여러 번 사용할 수도 있습니다.

[식 for 변수1 in 리스트1 if 조건식1     for 변수2 in 리스트2 if 조건식2     ...     for 변수n in 리스트n if 조건식n]
 
list(식 for 변수1 in 리스트1 if 조건식1         for 변수2 in 리스트2 if 조건식2         ...         for 변수n in 리스트n if 조건식n)

>>> 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]
a = [i * j for j in range(2, 10)
           for i in range(1, 10)]

image

리스트에 map 사용하기

이번에는 리스트에 map을 사용해보겠습니다. map은 리스트의 요소를 지정된 함수로 처리해주는 함수입니다 예를 들어 실수가 저장된 리스트가 있을 때 이 리스트의 모든 요소를 정수로 변환하려면 어떻게 해야 할까요? 먼저 for 반복문을 사용해서 변환해보겠습니다.

>>> a = [1.2, 2.5, 3.7, 4.6]
>>> for i in range(len(a)):
...     a[i] = int(a[i])
...
>>> a
[1, 2, 3, 4]

>>> a = [1.2, 2.5, 3.7, 4.6]
>>> a = list(map(int, a))
>>> a
[1, 2, 3, 4]

>>> a = list(map(str, range(10)))
>>> a
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

>>> a = input().split()
10 20 (입력)
>>> a
['10', '20']

>>> a = map(int, input().split())
10 20 (입력)
>>> a
<map object at 0x03DFB0D0>
>>> list(a)
[10, 20]

>>> a, b = [10, 20]
>>> a
10
>>> b
20

x = input().split()    # input().split()의 결과는 문자열 리스트
m = map(int, x)        # 리스트의 요소를 int로 변환, 결과는 맵 객체
a, b = m               # 맵 객체는 변수 여러 개에 저장할 수 있음

튜플 응용하기

index(값)은 튜플에서 특정 값의 인덱스를 구합니다. 이때 같은 값이 여러 개일 경우 처음 찾은 인덱스를 구합니다(가장 작은 인덱스). 다음은 53이 세 번째에 있으므로 인덱스 2가 나옵니다.

>>> a = (38, 21, 53, 62, 19, 53)
>>> a.index(53)
2

count(값)은 튜플에서 특정 값의 개수를 구합니다. 다음은 튜플 (10, 20, 30, 15, 20, 40)에서 20의 개수를 구합니다. 여기서는 20이 2개 들어있으므로 2가 나옵니다.

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

for 반복문으로 요소를 출력하는 방법은 리스트와 같습니다.

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

튜플 표현식 사용하기

>>> a = tuple(i for i in range(10) if i % 2 == 0)
>>> a
(0, 2, 4, 6, 8)

>>> (i for i in range(10) if i % 2 == 0)
<generator object <genexpr> at 0x050FE420>

tuple에 map 사용하기

>>> a = (1.2, 2.5, 3.7, 4.6)
>>> a = tuple(map(int, a))
>>> a
(1, 2, 3, 4)

튜플에서 가장 작은 수, 가장 큰 수, 합계 구하기

>>> a = (38, 21, 53, 62, 19)
>>> min(a)
19
>>> max(a)
62
>>> sum(a)
193

Leave a comment