본문 바로가기
BASIC

리스트 표현식

by 자동매매 2023. 10. 9.

리스트 표현식( 리스트 컴프리헨션 / list comprehension) 사용하기

  • [ for 변수 in 리스트]
  • list( for 변수 in 리스트)
>>> 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]
 
 
 
리스트 표현식의 동작 순서

 

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

 

리스트 표현식에서 if 조건문 사용하기

  • [식 for 변수 in 리스트 if 조건식]
  • list(식 for 변수 in 리스트 if 조건식)
>>> a = [i for i in range(10) if i % 2 == 0]    # 0~9 숫자 중 2의 배수인 숫자(짝수)로 리스트 생성
>>> a
[0, 2, 4, 6, 8]
 
 
 
 
 
리스트 표현식에서 if 조건문 사용하기
>>> 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)

 

다음은 2단부터 9단까지 구구단을 리스트 생성합니다.

>>> 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)]
 
 
리스트 표현식에 for가 여러 개일 때 처리 순서
start, last = map(int, input().split())
L = [2**i for i in range(start,last+1) if i != start+1 and i != last-1]
print(L)

 

 

2차원 리스트의 요소에 접근하기

  • 리스트[세로인덱스][가로인덱스]
  • 리스트[세로인덱스][가로인덱스] = 값
>>> a = [[10, 20], [30, 40], [50, 60]]
>>> a[0] [0]            # 세로 인덱스 0, 가로 인덱스 0인 요소 출력
10
>>> a[1][1]           # 세로 인덱스 1, 가로 인덱스 1인 요소 출력
40
>>> a[2][1]           # 세로 인덱스 2, 가로 인덱스 0인 요소 출력
60
>>> a[0][1] = 1000    # 세로 인덱스 0, 가로 인덱스 1인 요소에 값 할당
>>> a[0][1]
1000

 

 

만약 2차원 리스트의 사각형 구조를 유지하도록 출력하려면 pprint 모듈의 pprint 함수를 사용합니다.

>>> from pprint import pprint
>>> pprint(a, indent=4, width=20)
[   [10, 20],
    [30, 40],
    [50, 60]]

indent는 들여쓰기 칸 수, width는 가로 폭입니다. 각자 상황에 맞게 들여쓰기 칸 수와 가로 폭을 조절해서 사용해보세요.

 

sorted로 2차원 리스트 정렬하기

2차원 리스트를 정렬할 때는 sorted 함수를 사용합니다.

sorted(반복가능한객체, key=정렬함수, reverse=True 또는 False)

students = [
    ['john', 'C', 19],
    ['maria', 'A', 25],
    ['andrew', 'B', 7]
]
 
print(sorted(students, key=lambda student: student[1]))  # 안쪽 리스트의 인덱스 1을 기준으로 정렬
print(sorted(students, key=lambda student: student[2]))  # 안쪽 리스트의 인덱스 2를 기준으로 정렬

 

[['maria', 'A', 25], ['andrew', 'B', 7], ['john', 'C', 19]]
[['andrew', 'B', 7], ['john', 'C', 19], ['maria', 'A', 25]]
 

sorted key에 정렬 함수를 지정하여 안쪽 리스트의 요소를 기준으로 정렬했습니다. 

student[1]은 안쪽 리스트의 인덱스 1을 뜻하며 'A', 'B', 'C' 순으로 정렬합니다. 마찬가지로 student[2]는 안쪽 리스트의 인덱스 2를 뜻하며 7, 19, 25 순으로 정렬합니다. 

 

 

[ 연습문제 ] - 3차원 list 생성

a = [[[0 for col in range(3)] for row in range(4)] for depth in range(2)]
print(a)

 

 

[ 심화문제 ]

"""
표준 입력으로 2차원 리스트의 가로(col)와 세로(row)가 입력되고 
그 다음 줄부터 리스트의 요소로 들어갈 문자가 입력됩니다. 이때 2차원 리스트 안에서 *는 지뢰이고 .은 지뢰가 아닙니다. 
지뢰가 아닌 요소에는 인접한 지뢰의 개수를 출력하는 프로그램을 만드세요(input에서 안내 문자열은 출력하지 않아야 합니다).

여러 줄을 입력 받으려면 다음과 같이 for 반복문에서 input을 호출한 뒤 append로 각 줄을 추가하면 됩니다
(list 안에 문자열을 넣으면 문자열이 문자 리스트로 변환됩니다).

matrix = []
for i in range(row):
    matrix.append(list(input()))

입력
3 3
.**
*..
.*.
결과
2**
*43
2*1


입력
5 5
..*..
...*.
.*...
.***.
*.*..
결과
01*21
123*1
2*532
3***1
*4*31
  
"""
from pprint import pprint
row, col = map(int, input().split())
matrix = []
for i in range(row):
    matrix.append(list(input()))

for i in range(row):
    for j in range(col):
        if matrix[i][j] == ".":
            count = 0
            for i1 in [-1,0,1]:
                if 0<=i+i1<=row-1 :
                    for j1 in [-1,0,1]:
                        if 0<=j+j1<=col-1:
                            if matrix[i+i1][j +j1] == "*":
                                count += 1

            matrix[i][j] = str(count)
pprint(matrix,indent=5,width=col+30)

'BASIC' 카테고리의 다른 글

튜플 응용하기  (1) 2023.10.09
map  (0) 2023.10.09
리스트의 가장 작은 수, 가장 큰 수, 합계 구하기  (0) 2023.10.09
리스트 반복문  (1) 2023.10.09
리스트의 할당과 복사 알아보기  (0) 2023.10.09

댓글