list comprehension이라는 말은 set comprehension으로부터 왔으며, 완전 포함(complete inclusion) 또는 완전 서술(complete description)이라는 의미를 갖는다.
최종수정일 : 2023.09.19
{2∙x | x∈Z, x>0}
위의 조건제시법을 통해 양의 정수이면서 2의 배수인 값을 갖는 집합을 설명할 수 있다. 위의 예시에서 요소를 하나씩 살펴보면 다음과 같다.
x
집합의 요소(element)를 가리키며 어떤 문자로도 대체하여 사용할 수 있다.
2∙x
표현식으로 결과 집합의 원소를 표현한다.
|
는 such that 즉, x가 어떤 집합에 속하고, 어떤 조건을 갖는지를 가리킨다.
Z
정수 집합으로 x가 어떤 집합에 속하는지를 나타낸다.
x>0
결과 집합을 만드는데 포함될 x의 조건을 나타낸다.
리스트 컴프리핸션은 이와 같은 표현법을 차용한다.
#use 'for' loop combs = [] for x in [1,2,3]: for y in [3,1,4]: if x != y: combs.append((x, y)) combs #result : [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)] #use comprehesion [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] #result : [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
위 코드에서 는 같은 값을 내포하는 리스트를 생성하기 위해 for문과 list comprehension을 사용하였다.
list comprehension의 각 요소를 위에서 언급한 요소들과 비교해보면 다음과 같다.
(x, y)
결과 집합의 원소를 나타낸다.
for x
순회할 집합의 원소를 나타낸다.
in [1,2,3]
x가 순회할 집합을 나타낸다.
for y in [3,1,4]
또 다른 순회할 집합과 순회하며 추출된 원소를 나타낸다.
if x != y
결과 집합을 만드는데 사용될 조건을 나타낸다.
리스트 컴프리핸션은 다음과 같은 용도로 사용될 수 있다.
text = "Python is fun!" vowels = "AEIOUaeiou" vowels_in_text = [char for char in text if char in vowels] print(vowels_in_text)
matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] transposed_matrix = [[row[i] for row in matrix] for i in >range(len(matrix[0]))] print(transposed_matrix)
list1 = [1, 2, 3, 4] list2 = [5, 6, 7, 8] multiplied_list = [x * y for x, y in zip(list1, list2)] print(multiplied_list)
with open("example.txt", "r") as file: long_lines = [line.strip() for line in file if len(line.strip()) >= 10] print(long_lines)
위 예시 외에도 다양하게 응용할 수 있을 것이다.
리스트 컴프리핸션은 반복문에 비해 실행 속도가 최적화되어있고, 코드가 간결할 수 있다.
그러나 연산을 위해 데이터를 메모리에 한번에 적재하므로, 대규모의 데이터에 대해 적용할 경우 속도가 급격히 느려질 수 있다.
myGenerator = ( n*2 for n in range(1000) )
list comprehension과 같은 어법에서 대괄호 대신 괄호를 사용할 경우 제너레이터를 생성할 수 있다.