리스트 선언

단순 선언

arr = []
arr = [1, 2, 3]
arr = [[] for _ in range(n)]

range 기반 선언(range는 a이상 b미만)

arr = list(range(10))        # 0~9
arr = list(range(1, 11))     # 1~10
arr = list(range(0, 21, 2))  # 0,2,4,...20

k의 배수 리스트 만들기

k = 3
arr = [i * k for i in range(0, 10)]  # 0,3,6,9,...

map 사용 (문자열 입력 숫자로 변환)

arr = list(map(int, input().split()))

set 사용 (문자열 중복 제거)

list(set(my_list))   # 순서 상관없이 중복 제거
list(dict.fromkeys(my_list))  # 순서 유지 중복 제거

조건/가공 포함 리스트 컴프리헨션

arr = [x*x for x in range(10)]
even = [x for x in range(10) if x % 2 == 0]

리스트 초기화

n개의 0으로 초기화

arr = [0] * n

2차원 배열 초기화 (정방형)

board = [[0] * m for _ in range(n)]

주의
board = [[0] * m] * n
는 shallow copy라 모든 행이 같은 리스트를 참조하므로 절대 금지.

길이가 다른 2차원 배열 생성

board = []
for _ in range(n):
    size = int(input())
    board.append([0] * size)

리스트 인덱스 기반 반복

기본 for 문

for i in range(len(arr)):
    print(i, arr[i])

enumerate (index + value)

for idx, val in enumerate(arr):
    print(idx, val)

2차원 배열 반복

기본 x, y 중첩 반복

for x in range(n):
    for y in range(m):
        print(board[x][y])

x, y, z 여러 중첩 반복

for x in range(A):
    for y in range(B):
        for z in range(C):
            pass

길이가 다른 2차 배열

for row in board:
    for val in row:
        print(val)

리스트 추가 / 삭제 / 삽입 / 합치기

append / pop

arr.append(5)
arr.pop()        # 마지막 요소 제거
arr.pop(i)       # i번째 요소 제거

insert

arr.insert(2, 99)  # index 2에 99 삽입

remove

arr.remove(3)      # 값 3을 제거 (가장 처음 발견된 요소만)

join 결합

arr.extend(other)
 
new = arr + other

join 결합

"".join(arr)

extend (리스트 합치기)

arr.extend(other)
 
new = arr + other

zip으로 1:1 매칭된 튜플 만들기

a = [1, 2, 3]
b = ['a', 'b', 'c']
 
pairs = list(zip(a, b))
# [(1, 'a'), (2, 'b'), (3, 'c')]

리스트 정렬

오름차순 / 내림차순

arr.sort()
arr.sort(reverse=True)

key 옵션 (매우 중요!)

arr.sort(key=lambda x: x[1])                 # 두 번째 요소 기준
arr.sort(key=lambda x: (x[0], -x[1]))        # 복합 정렬

sorted (원본 유지)

res = sorted(arr)

리스트 슬라이싱

sub = arr[2:5]     # index 2~4
rev = arr[::-1]    # reverse
cen = arr[1:-1]    # 앞뒤 빼고

리스트에서 특정 범위 개수 세기 (이분 탐색)

from bisect import bisect_left, bisect_right
 
cnt = bisect_right(arr, R) - bisect_left(arr, L)

리스트에서 빈도 기반 개수 세기

from collections import Counter
 
Counter(arr).most_common()

두 리스트의 모든 조합 만들기

a = [1, 2]
b = ['A', 'B', 'C']
 
pairs = [(x, y) for x in a for y in b]
# [(1,'A'), (1,'B'), (1,'C'), (2,'A'), (2,'B'), (2,'C')]
 
# itertools.product 방법
from itertools import product
list(product(a, b))

코테에서 많이 쓰는 패턴

최대값 위치 찾기

idx = arr.index(max(arr))

2차원 배열 복사 (deep copy)

import copy
b = copy.deepcopy(a)

조건으로 배열 재가공

minx_list = [row.find("#") for row in wallpaper if row.find("#") != -1]
y_list = ["exist" if row.find("#") != -1 else "none" for row in wallpaper]

뒤에서부터 리스트 index 검색(리스트는 rindex가 없음)

idx = len(my_list) - 1 - my_list[::-1].index("#")