Python μ»΄ν리ν¨μ λ° ννμ μ 리
PythonμΌλ‘ μκ³ λ¦¬μ¦μ 곡λΆν λ λμΉ μ μλ κ°λ λ€ μ€ νλκ° λ°λ‘ μ»΄ν리ν¨μ (comprehension)κ³Ό ννμ(expression)μ λλ€. Pythonμμλ λ°λ³΅λ¬Έκ³Ό 쑰건문μ κ°κ²°νκ² ννν μ μλ list comprehension, generator expression, conditional expression(μΌν μ°μ°μ) λ±μ μ 곡νμ¬, μ μ νκ² μ¬μ© μ μ±λ₯(μ€νμλ)κ³Ό κ°κ²°ν¨μ λ λ€ μ‘μ μ μμ΅λλ€.
μ΄λ² ν¬μ€νΈμμλ κ°μ’ μ»΄ν리ν¨μ λ° ννμμ κ°λ κ³Ό μ¬μ©λ²μ μ 리ν©λλ€.
μμΈλ¬, μ΄λ€μ λλ€(lambda)μκΉμ§ μ μ©ν μμ λ νλ² μ΄ν΄λ³΄μκ² μ΅λλ€.
λͺ©μ°¨:
1. List Comprehensions
2. Set Comprehensions
3. Dictionary Comprehensions
4. Generator Expressions
5. Conditional Expressions
6. Nested Loops in Comprehensions/Expressions
7. Lambda μ μ©νκΈ°
8. λ λμκ°κΈ° - μν°ν¨ν΄
1. List Comprehensions
리μ€νΈ μ»΄ν리ν¨μ (List Comprehension)μ κΈ°μ‘΄ 리μ€νΈλ μ΄ν°λ¬λΈ κ°μ²΄(λ°λ³΅κ°λ₯ κ°μ²΄)μμ μλ‘μ΄ λ¦¬μ€νΈλ₯Ό κ°κ²°νκ³ ν¨μ¨μ μΌλ‘ μμ±ν μ μκ² ν΄μ£Όλ λ¬Έλ²μ λλ€. forλ¬Έ λ€μ ifλ₯Ό λΆμμΌλ‘μ¨ νν°λ§ κΈ°λ₯λ μνν μ μμ΅λλ€.
[ννμ for λ³μ in μ΄ν°λ¬λΈ if 쑰건]
νΉμ§:
- νν°λ§κ³Ό λ³νμ λμμ μ²λ¦¬
- κΈ°μ‘΄ forλ¬Έλ³΄λ€ λΉ λ₯΄κ³ , μ½λλ μ§§μ ==> μ±λ₯ & κ°λ μ± κ°μ
- μ‘°κ±΄λΆ ννμ (conditional expressions)μ ν¨κ» μ¬μ© κ°λ₯ ==> νν°λ§ κΈ°λ₯
μμ 1-0: range()λ‘ 0λΆν° 9κΉμ§μ 리μ€νΈ μμ±
# 기쑴 for문
numbers_list = []
for x in range(10):
numbers_list.append(x)
# List comprehension μ μ©
numbers_list = [x for x in range(10)]
# μΆλ ₯
print(numbers_list) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
μμ 1-1: λ¬Έμμ΄ ννμ μ λ ₯μ μ μνμΌλ‘ λ³ν => 리μ€νΈλ‘ μμ±
numbers_str = "1 2 43 2 325 25 5 354 36 47"
numbers_list = [x for x in map(int, numbers_str.split())]
# μΆλ ₯
print(numbers_list) # [1, 2, 43, 2, 325, 25, 5, 354, 36, 47]
μμ 1-2: λ¨μ΄ κΈΈμ΄ κ΅¬νκΈ°
sentence = "Python is fun"
word_lengths = [len(word) for word in sentence.split()]
print(word_lengths) # [6, 2, 3]
μμ 1-3: 1λΆν° 10κΉμ§ μ€ μ§μλ§ νν°λ§ ν κ°κ°μ μ κ³±μ μΆλ ₯
squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print(squares) # [4, 16, 36, 64, 100]
μμ 1-4: (μμ, μ κ³±)μ ννμ 리μ€νΈ μμ±
numbers = [1, 2, 3, 4]
tuple_list = [(x, x**2) for x in numbers]
print(tuple_list) # [(1, 1), (2, 4), (3, 9), (4, 16)]
μμ 1-5: 2μ°¨μ 리μ€νΈ μμ± (μ€μ²©λ 리μ€νΈ μ»΄ν리ν¨μ )
# 3κ°μ ν(row)μ 2κ°μ μ΄(column)μ κ°μ§λ 2μ°¨μ 리μ€νΈ
# μ¦ 2x3μ 2μ°¨μ 리μ€νΈ - ν·κ°λ¦¬μ λ€λ©΄, μ²μ²ν 보μΈμ, 6. Nest Loops νλͺ©μμ λ ν·κ°λ¦¬μ€ μ μμ΅λλ€
matrix_a = [[None]*2 for i in range(3)]
matrix_b = [[None for j in range(2)] for i in range(3)]
print(matrix_a) # [[None, None], [None, None], [None, None]]
print(matrix_b) # [[None, None], [None, None], [None, None]]
μμ 1-6: κ΅¬κ΅¬λ¨ 2μ°¨μ 리μ€νΈ μμ± (μ€μ²©λ 리μ€νΈ μ»΄ν리ν¨μ )
multiplication_table = [[i * j for j in range(1, 10)] for i in range(2, 10)]
print(row)
2. Set Comprehensions
μ§ν©(set
)μ μμ±νλ μ»΄ν리ν¨μ
. 리μ€νΈ μ»΄ν리ν¨μ
κ³Ό κ°μ§λ§ μ€κ΄νΈ {}
λ‘ κ°μΈκ³ , μ€λ³΅ μμ΄ μμλ₯Ό μμ§ν©λλ€.
{ννμ for λ³μ in μ΄ν°λ¬λΈ if 쑰건}
νΉμ§:
- μ€λ³΅ μ κ±°λ κ²°κ³Όκ° μλ μμ±λ¨
- λ°μ΄ν° νν°λ§ ν μ€λ³΅ μλ κ²°κ³Ό νμν λ μ μ©
μμ 2-1: λ¬Έμμ΄μμ λͺ¨μ μΆμΆνμ¬ μ§ν© μμ±
text = "Hello World"
vowels = {char.lower() for char in text if char.lower() in 'aeiou'}
print(vowels) # {'e', 'o'}
μμ 2-2: 1λΆν° 21κΉμ§, 5μ λ°°μμ μ§ν© μμ±
multiples_of_5 = {x for x in range(1, 21) if x % 5 == 0}
print(multiples_of_5) # {5, 10, 15, 20}
3. Generator Expressions
μ λλ μ΄ν° ννμμ 리μ€νΈ μ»΄ν리ν¨μ
κ³Ό μ μ¬νμ§λ§ ()
λ‘ κ°μλλ€. κ°μ νλμ© μμ±νλ―λ‘ (lazy evaluation), μ΄λ₯Ό μ νμ©νλ©΄ λ©λͺ¨λ¦¬λ₯Ό λ μΈ μ μμ΅λλ€.
(ννμ for λ³μ in μ΄ν°λ¬λΈ if 쑰건)
νΉμ§:
- λ©λͺ¨λ¦¬μ λͺ¨λ μμλ₯Ό μ¬λ¦¬μ§ μκ³ , νλμ© lazy evaluation
sum()
,max()
,any()
,all()
κ³Ό ν¨κ» μμ£Ό μ¬μ©ν©λλ€.- κ°μ λ¨ ν λ²λ§ κΊΌλΌ μ μμ΅λλ€. μ¦ μ¬μ¬μ© λΆκ°
μμ 3-1: 1λΆν° 11κΉμ§μ μ κ³±μ νλ¦°νΈ
squares_gen = (x**2 for x in range(1, 11))
for square in squares_gen:
print(square)
μμ 3-2: 3μ λ°°μμ ν© (μ λλ μ΄ν° ννμ)
sum_of_multiples = sum(x for x in range(1, 101) if x % 3 == 0)
print(sum_of_multiples) # 1683
μμ 3-3: 2μ°¨μ 리μ€νΈμμ 쑰건 λ§μ‘± μμ κ°μ μΈκΈ°
matrix = [
[3, 5, 7],
[2, 6, 4],
[8, 1, 9]
]
count_ge_5 = sum(1 for row in matrix for item in row if item >= 5)
print(count_ge_5) # 5
μμ 3-4: 리μ€νΈ ν©κ³Ό νκ· κ³μ°νκΈ°
numbers = [10, 20, 30, 40, 50]
total = sum(x for x in numbers)
average = total / len(numbers)
print(total, average) # 150 30.0
4. Conditional Expressions
μ»΄ν리ν¨μ λ΄λΆμμ μ¬μ©ν μ μλ μΌν μ°μ°μμ λλ€. λμ€λ κ° μ체λ₯Ό 쑰건μ λ°λΌ λ°κΏ λ μ¬μ©λ©λλ€. μμ 1-3.μμ 보μ¬λλ¦° νν°λ§κ³Όλ ꡬλ³λλ κ°λ μ λλ€. forλ¬Έμ μ¬μ©νμ§ μλ ννμλ μ‘΄μ¬ν©λλ€ (μμ 4-1).
[μ°ΈμΌλμκ° if 쑰건 else κ±°μ§μΌλμκ° for λ³μ in μ΄ν°λ¬λΈ]
νΉμ§:
- λμ€λ κ° μ체λ₯Ό 쑰건μ λ°λΌ λ³νν¨ ==> νν°λ§κ³Όλ λ€λ¦!
- νν°λ§κ³Ό νΌλνμ§ μλλ‘ μ£Όμ
μμ 4-1: κ²½μ°μ λ°λ₯Έ λ¬Έμμ΄ μΆλ ₯
def foo():
return True
foo_result = 'YES' if foo() else 'NO'
print(foo_result) # YES
μμ 4-2: μ‘°κ±΄λΆ ννμμ μ¬μ©ν 리μ€νΈ λ³ν
numbers = [1, 2, 3, 4, 5, 6]
even_or_zero = [x if x % 2 == 0 else 0 for x in numbers]
print(even_or_zero) # [0, 2, 0, 4, 0, 6]
μμ 4-3: μ§μ/νμ λ§€ν 리μ€νΈ μμ±νκΈ°
numbers = [1, 2, 3, 4, 5]
parity = ["Even" if x % 2 == 0 else "Odd" for x in numbers]
print(parity) # ['Odd', 'Even', 'Odd', 'Even', 'Odd']
5. Dictionary Comprehensions
λμ
λ리 μ»΄ν리ν¨μ
μ {key: value}
ννλ‘ λμ
λ리λ₯Ό λΉ λ₯΄κ² μμ±ν©λλ€. Setμ²λΌ { }
λ₯Ό μ¬μ©νμ§λ§, μλ key: value
μ μ‘°ν©μ΄λ―λ‘, :
κ° λ€μ΄κ°μΌλ‘μ¨ set comprehensionsμ ꡬλ³λ©λλ€.
{key_expr: value_expr for λ³μ in μ΄ν°λ¬λΈ if 쑰건}
νΉμ§:
- ν€-κ° μμ λμ μΌλ‘ μμ±ν λ μ μ©
- νΉμ κ·μΉμΌλ‘ λ§€νλ λμ λ리λ₯Ό λ§λ€κΈ° μ’μ
μμ 5-1: μ«μμ μ κ³±μ λμ λ리 λ§λ€κΈ°
numbers = [1, 2, 3, 4, 5]
square_dict = {x: x**2 for x in numbers}
print(square_dict) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
μμ 5-2: λ¬Έμμ΄μ 첫 κΈμμ λ°λ₯Έ μνλ²³ μμ λ²νΈ λμ λ리
words = ['apple', 'banana', 'cherry']
alpha_index = {word: ord(word[0].lower()) - ord('a') + 1 for word in words}
print(alpha_index) # {'apple': 1, 'banana': 2, 'cherry': 3}
μμ 5-3: κ·Έλνμμ, κ° λ Έλλ₯Ό λμ λλ¦¬λ‘ μ μ₯ (λ°±μ€ 1991 "νΈλ¦¬ μν" μ°Έμ‘°)
μ΄ μμ λ generator expressionκ³Ό dictionary comprehensionμ μ€μ²©ν κ²½μ°μ λλ€.
# μ
λ ₯ μμ - λ°±μ€ 1991 "νΈλ¦¬ μν" μ°Έμ‘°
"""
A B C
B D .
C E F
E . .
F . G
D . .
G . .
"""
tree = {root: (left, right) for root, left, right in (input().split() for _ in range(n))}
print(tree) # {'A': ('B', 'C'), 'B': ('D', '.'), 'C': ('E', 'F'), 'E': ('.', '.'), 'F': ('.', 'G'), 'D': ('.', '.'), 'G': ('.', '.')}
6. Nested Loops in Comprehensions/Expressions
Nested loops, μ¦, 2κ° μ΄μμ forλ¬Έμ΄ μ€μ²©λλ ννμ λλ€. λ€μ°¨μ 리μ€νΈ λ±μ λ§λ€κ±°λ μ¬λ¬ 리μ€νΈμ μ‘°ν©μ κ³μ°ν λ μ μ©ν©λλ€. Nested comprehensions/expressionsμλ ꡬλ³λλ κ°λ μ λλ€.
[ννμ for λ³μ1 in μ΄ν°λ¬λΈ1 for λ³μ2 in μ΄ν°λ¬λΈ2 ...]
νΉμ§:
- μ΄μ€ λ°λ³΅λ¬Έμ ν μ€λ‘ νν κ°λ₯
- λ€μ°¨μ ꡬ쑰(νλ ¬ λ±)μ μ ν©
μμ 6-1: 리μ€νΈ μ‘°ν©μΌλ‘ νν μμ±
pairs = [(x, y) for x in [1, 2, 3] for y in ['a', 'b']]
print(pairs) # [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (3, 'a'), (3, 'b')]
μμ 6-2: 리μ€νΈ μ‘°ν©μΌλ‘ κ° ν©μ 리μ€νΈ μμ±
list1 = [1, 2]
list2 = [10, 20, 30]
combination_sums = [x + y for x in list1 for y in list2]
print(combination_sums) # [11, 21, 31, 12, 22, 32]
μμ 6-3: λ€μ°¨μ 리μ€νΈλ₯Ό λ¨μ°¨μμΌλ‘ ν΄κΈ° (flattening)
my_lists = [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]
flat = [fooooooo for sublist1 in my_lists for sublist2 in sublist1 for fooooooo in sublist2]
print(flat) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
μμ 6-4: λ€μ°¨μ 리μ€νΈ λ΄μ 0μ΄λΌλ κ°μ΄ μ‘΄μ¬νλ©΄ "YES", μμΌλ©΄ "NO" νμ
# 리μ€νΈ λ΄μ 0μ΄λΌλ κ°μ΄ νλλΌλ μ‘΄μ¬νλ©΄ "YES", μ΄μΈμλ "NO"λ₯Ό νλ¦°νΈ
block = [[[0, -1, 0, 0, 0], [-1, -1, 0, 1, 1], [0, 0, 0, 1, 1]]]
print("YES" if any(0 in col for row in block for col in row) else "NO") # YES
# μ λΉν indentation μ μ© μ
print("YES" if any( 0 in col
for row in block
for col in row) else "NO")
β» μ 1. List Comprehensionsμ 2μ°¨μ 리μ€νΈ μμ±κ³Ό λΉκ΅νμ¬, forλ¬Έμ μ΄λ€ μμλ‘ μ½μ΄μΌ ν μ§λ₯Ό μ€μ μ μΌλ‘ 보μΈμ.
7. Lambda μ μ©νκΈ°
Lambdaλ μ½κ² λ§νλ©΄ 'μ΅λͺ
ν¨μ'λ‘, λ¨μΌ λ¬Έμ₯(1μ€)μ μ½λλ‘ μμ±λ©λλ€. ν¨μ λ΄λΆμλ return
λ¬Έμ΄ ν¬ν¨λμ§ μμ§λ§, μ μ체λ‘λΆν° λμ€λ κ°μ λ°νν©λλ€.
μ comprehensions λ° expressionsμ lambdaλ₯Ό μ μ©νμ¬, κΈ°μ‘΄μ μ΄ν°λ¬λΈ κ°μ²΄λ‘λΆν° μλ‘μ΄ λ¦¬μ€νΈ λ±μ κ°κ²°νκ² μμ±ν μ μμ΅λλ€.
# μλλ x+y κ°μ λ°ννλ lambdaμμ
λλ€.
add = lambda x, y: x + y
μμ 7-1: κ° μμμ μ κ³±μ 리μ€νΈ μ»΄ν리ν¨μ ==> νλ¦°νΈ
numbers = [1, 2, 3, 4, 5]
square = lambda x: x ** 2
squares = [square(x) for x in numbers]
print(squares) # [1, 4, 9, 16, 25]
μμ 7-2: μ§μμΈ μμλ§ μΆλ €μ ν΄λΉ μμλ€μ μ κ³±μ μ λλ μ΄ν° ννμ => ν©κ³
square = lambda x: x ** 2
sum_of_even_squares = sum(square(x) for x in range(1, 11) if x % 2 == 0)
print(sum_of_even_squares) # 220 (4 + 16 + 36 + 64 + 100)
8. λ λμκ°κΈ° - μν°ν¨ν΄
μλμ μ±λ₯μ κ°κ²°ν¨μ μ‘μ μ μλ€κ³ μΈκΈ λλ ΈμΌλ, μμ΄ μ§λμΉκ² 볡μ‘ν΄μ§λ κ²½μ°μλ μ€νλ € μΌλ°μ μΈ λ°λ³΅λ¬Έλ³΄λ€ κ°λ μ±μ΄ λλΉ μ§κ² λ©λλ€. μλ₯Ό λ€μ΄, μλμ κ°μ΄ μ§λλ μ°¨λΌλ¦¬ κΈ°μ‘΄μ λ°©μλλ‘ μμ±νλ κ²μ΄ μ’μ μ μμ΅λλ€.
# κ²½κ³ : μλ μ½λλ κ³ μλ‘ λν΄νκ², μ μ§λ³΄μνκΈ° νλ€λλ‘ μμ±ν μν°ν¨ν΄ μμμ.
bad_sample = {f"key_{i}": ([[[x if x % 2 == 0 else -x for x in range(j, j + 3)] for j in range(k, k + 2)] for k in range(i, i + 3)] if i % 2 == 0 else {f"subkey_{k}": {f"inner_{n}": n if n % 3 == 0 else n * 2 for n in range(k, k + 3)} for k in range(i, i + 3)}) for i in range(1, 4)}
import pprint
pprint.pprint(bad_sample)
""" μ€ν κ²°κ³Ό:
{'key_1': {'subkey_1': {'inner_1': 2, 'inner_2': 4, 'inner_3': 3},
'subkey_2': {'inner_2': 4, 'inner_3': 3, 'inner_4': 8},
'subkey_3': {'inner_3': 3, 'inner_4': 8, 'inner_5': 10}},
'key_2': [[[2, -3, 4], [-3, 4, -5]],
[[-3, 4, -5], [4, -5, 6]],
[[4, -5, 6], [-5, 6, -7]]],
'key_3': {'subkey_3': {'inner_3': 3, 'inner_4': 8, 'inner_5': 10},
'subkey_4': {'inner_4': 8, 'inner_5': 10, 'inner_6': 6},
'subkey_5': {'inner_5': 10, 'inner_6': 6, 'inner_7': 14}}}
"""
μ°Έκ³ μλ£: