파이썬 자주 쓰는 문법 & 원라이너 치트시트: 복붙해서 바로 쓰는 실전 패턴 모음
파이썬 원라이너 치트시트. 리스트 중복 제거, 리스트 평탄화, 딕셔너리 합치기·정렬, zip 전치, f-string 포맷팅까지 — 개발자가 매번 검색하는 파이썬 관용구를 복사해서 바로 쓰세요.
파이썬 자주 쓰는 문법 & 원라이너 치트시트: 복붙해서 바로 쓰는 실전 패턴 모음
파이썬을 쓰다 보면 "이거 한 줄로 어떻게 쓰더라?"를 끊임없이 검색하게 됩니다. "파이썬 리스트 중복 제거", "딕셔너리 정렬", "리스트 평탄화"… 결국 매번 같은 스택오버플로우 답변을 찾게 되죠.
이 글은 그 검색을 끝내기 위한 레퍼런스입니다. 실무와 PS 양쪽에서 자주 쓰는 파이썬 관용구(idiom)와 원라이너만 모았고, 전부 복사해서 바로 붙여넣을 수 있게 정리했습니다. 앞선 [파이썬 알고리즘 치트시트]의 후속 편입니다.
동작 환경: Python 3.8+ (대부분 표준 문법, 일부는 3.9+ / 3.10+ 표기)
1. 리스트 컴프리헨션
파이썬의 핵심. for문을 한 줄로 압축합니다.
# 기본
squares = [x ** 2 for x in range(10)]
# 조건 필터링 (if는 뒤에)
evens = [x for x in range(10) if x % 2 == 0]
# 조건부 값 (if-else는 앞에)
labels = ["짝" if x % 2 == 0 else "홀" for x in range(10)]
# 중첩 반복 (이중 for문)
pairs = [(i, j) for i in range(3) for j in range(3)]
2. 딕셔너리 / 집합 컴프리헨션
# 딕셔너리 컴프리헨션
squared = {x: x ** 2 for x in range(5)} # {0:0, 1:1, 2:4, ...}
# 두 리스트를 딕셔너리로
keys = ['a', 'b', 'c']
vals = [1, 2, 3]
d = {k: v for k, v in zip(keys, vals)} # {'a':1, 'b':2, 'c':3}
# 키-값 뒤집기
inverted = {v: k for k, v in d.items()}
# 집합 컴프리헨션 (중복 자동 제거)
unique = {x % 3 for x in range(10)} # {0, 1, 2}
3. 리스트 중복 제거
# 순서 상관없을 때
unique = list(set(arr))
# 순서 유지하며 중복 제거 (Python 3.7+ dict 순서 보장)
unique = list(dict.fromkeys(arr))
4. 리스트 평탄화 (flatten)
2차원 리스트를 1차원으로.
nested = [[1, 2], [3, 4], [5, 6]]
# 컴프리헨션
flat = [x for row in nested for x in row] # [1, 2, 3, 4, 5, 6]
# itertools 사용
from itertools import chain
flat = list(chain.from_iterable(nested))
# sum 트릭 (작은 리스트에만, 느림 주의)
flat = sum(nested, [])
5. enumerate / zip
인덱스와 값을 동시에, 또는 여러 리스트를 동시에 순회.
# 인덱스 + 값
for i, val in enumerate(arr):
print(i, val)
# 시작 인덱스 지정
for i, val in enumerate(arr, start=1):
print(i, val)
# 여러 리스트 동시 순회
for a, b in zip(list1, list2):
print(a, b)
# zip으로 2차원 리스트 전치 (transpose)
matrix = [[1, 2, 3], [4, 5, 6]]
transposed = list(zip(*matrix)) # [(1,4), (2,5), (3,6)]
6. 변수 교환 / 다중 할당 (언패킹)
# 두 변수 swap (임시 변수 불필요)
a, b = b, a
# 다중 할당
x, y, z = 1, 2, 3
# 별표 언패킹: 나머지 묶기
first, *rest = [1, 2, 3, 4] # first=1, rest=[2, 3, 4]
*init, last = [1, 2, 3, 4] # init=[1, 2, 3], last=4
a, *mid, b = [1, 2, 3, 4, 5] # a=1, mid=[2,3,4], b=5
7. 슬라이싱 트릭
arr[::-1] # 리스트/문자열 뒤집기
arr[::2] # 짝수 인덱스만 (스텝 2)
arr[1::2] # 홀수 인덱스만
arr[-3:] # 마지막 3개
arr[:-3] # 마지막 3개 제외
arr[:] # 얕은 복사 (shallow copy)
8. 문자열 처리
가장 자주 검색되는 영역입니다.
s = "hello world"
s.upper() # 'HELLO WORLD'
s.lower() # 'hello world'
s.title() # 'Hello World'
s.replace("o", "0") # 'hell0 w0rld'
s.split() # ['hello', 'world'] (공백 기준)
s.split(",") # 콤마 기준 분리
"-".join(["a", "b", "c"]) # 'a-b-c'
s.strip() # 양쪽 공백 제거
s[::-1] # 문자열 뒤집기
# 문자 빈도 세기
from collections import Counter
Counter("banana") # {'a': 3, 'n': 2, 'b': 1}
# 숫자만 추출
"".join(c for c in "a1b2c3" if c.isdigit()) # '123'
9. f-string 포맷팅
Python 3.6+의 표준 포맷팅 방식.
name, score = "Kim", 95.6789
f"{name}님의 점수: {score}" # 'Kim님의 점수: 95.6789'
f"{score:.2f}" # '95.68' (소수점 2자리)
f"{1000000:,}" # '1,000,000' (천 단위 콤마)
f"{42:05d}" # '00042' (0 채움)
f"{0.25:.1%}" # '25.0%' (퍼센트)
f"{255:x}" # 'ff' (16진수)
f"{name=}" # "name='Kim'" (디버깅, 3.8+)
10. 조건 표현식 (삼항 연산자)
# 값 = 참일때 if 조건 else 거짓일때
result = "양수" if x > 0 else "음수 또는 0"
# 기본값 처리
name = user_name if user_name else "익명"
name = user_name or "익명" # 더 짧게 (falsy 값 처리)
11. any / all
nums = [2, 4, 6, 8]
all(x % 2 == 0 for x in nums) # 모두 짝수? → True
any(x > 5 for x in nums) # 하나라도 5 초과? → True
all(nums) # 모든 원소가 truthy?
any(nums) # 하나라도 truthy?
12. 딕셔너리 안전하게 다루기
d = {"a": 1, "b": 2}
d.get("c") # None (KeyError 없음)
d.get("c", 0) # 0 (기본값 지정)
d.setdefault("c", []).append(1) # 없으면 [] 생성 후 추가
# 딕셔너리 합치기 (3.9+)
merged = d1 | d2
# 3.5+ 호환 방식
merged = {**d1, **d2}
# 값 기준 정렬
sorted(d.items(), key=lambda x: x[1]) # 값 오름차순
sorted(d.items(), key=lambda x: x[1], reverse=True) # 값 내림차순
# 최댓값을 가진 키
max(d, key=d.get)
13. map / filter / lambda
# 문자열 리스트 → 정수 리스트
nums = list(map(int, ["1", "2", "3"]))
# 입력 한 줄 파싱 (PS 단골)
a, b, c = map(int, input().split())
# 조건 필터링
evens = list(filter(lambda x: x % 2 == 0, range(10)))
# reduce (누적 계산)
from functools import reduce
total = reduce(lambda acc, x: acc + x, [1, 2, 3, 4]) # 10
14. 최댓값 / 최솟값 활용
nums = [3, 1, 4, 1, 5, 9]
max(nums) # 9
min(nums) # 1
sum(nums) # 23
# key를 이용한 최댓값
words = ["apple", "kiwi", "banana"]
max(words, key=len) # 'banana' (가장 긴 문자열)
# 최댓값의 인덱스
nums.index(max(nums)) # 5
# 상위 N개
import heapq
heapq.nlargest(3, nums) # [9, 5, 4]
heapq.nsmallest(3, nums) # [1, 1, 3]
15. 숫자 다루기
divmod(17, 5) # (3, 2) — 몫과 나머지 동시에
abs(-7) # 7
round(3.14159, 2) # 3.14
pow(2, 10) # 1024
pow(2, 10, 1000) # 24 — (2^10) % 1000, 모듈러 거듭제곱
# 진법 변환
bin(10) # '0b1010'
oct(10) # '0o12'
hex(255) # '0xff'
int("1010", 2) # 10 — 2진수 문자열 → 정수
int("ff", 16) # 255
# 자릿수 합
sum(int(d) for d in str(12345)) # 15
16. 정렬 응용
sorted(arr) # 오름차순 (원본 유지)
sorted(arr, reverse=True) # 내림차순
arr.sort() # 제자리 정렬 (반환값 없음)
# 다중 기준
sorted(data, key=lambda x: (x[1], -x[0])) # 2번째 오름, 1번째 내림
# 문자열 길이순
sorted(words, key=len)
17. 파일 / 입력 한 줄 처리
# 파일 전체를 줄 리스트로
with open("file.txt") as f:
lines = f.read().splitlines()
# 파일을 한 줄씩 처리 (메모리 효율적)
with open("file.txt") as f:
for line in f:
process(line.rstrip())
# 여러 줄 입력 한 번에 (PS)
import sys
data = sys.stdin.read().split()
18. 알아두면 편한 짧은 문법들
# 카운트다운 반복
for i in range(10, 0, -1):
print(i)
# 같은 값으로 리스트 채우기
zeros = [0] * 5 # [0, 0, 0, 0, 0]
# 범위 검사 (체이닝)
if 0 <= x < 100: # 0 이상 100 미만
...
# 월러스 연산자 (3.8+) — 할당과 동시에 사용
while (line := input()) != "end":
print(line)
# 여러 값 중복 체크
if x in (1, 2, 3):
...
# 중첩 삼항 대신 딕셔너리 매핑
grade = {90: "A", 80: "B", 70: "C"}.get(score // 10 * 10, "F")
마무리
여기 정리한 패턴들은 검색 → 복붙 → 수정의 사이클을 크게 줄여줍니다. 파이썬의 강점은 "한 줄로 의도를 표현하는 능력"이고, 이 관용구들이 익숙해지면 코드가 짧아질 뿐 아니라 읽기도 쉬워집니다.
다만 한 줄에 집착해 가독성을 해치는 건 본말전도입니다. 복잡한 컴프리헨션을 세 번 중첩하느니 평범한 for문이 나을 때도 많으니, "짧게"보다 "명확하게"를 기준으로 선택하세요.
다음 편에서는 이 시리즈를 이어 다른 실전 주제로 찾아오겠습니다. 이 글이 도움이 됐다면 북마크해두고 필요할 때마다 꺼내 쓰세요.