반응형
구글링을 하다보면 코드안에 한줄로 for문을 돌리고 if문을 쓰는 코드가 있는데 처음엔 이해도 안되고 만들고 있는 코드를 완성하기 위해 가져다 쓰기 급급했는데 나중에 알아보니 list comprehension 라고 한글로 리스트 표현식, 리스트 조건식이라고 불리기도 한다
나중에 헷갈릴때 다시 찾아보려고 작성하는것으로 정확하지 않을수도 있다.
Python 공식 문서에서는 이렇게 정의한다
컴프리헨션은 하나의 표현식과 그 뒤를 다르는 최소한 하나의 for 절과 없거나 여러 개의 for 또는 if 절로 구성됩니다. 이 경우, 새 컨테이너의 요소들은 각 for 또는 if 절이 왼쪽에서 오른쪽으로 중첩된 블록을 이루고, 가장 안쪽에 있는 블록에서 표현식의 값을 구해서 만들어낸 것들입니다.
나와 같은 코린이는 이 글을 읽고 이해하기 힘들것이다. 코드를 직접 보면서 이해해보자.
1. 기본 구조 : 표현식 + for문
array = [표현식 for 변수 in 리스트]
2. 표현식 + for문 + 조건문
array = [표현식 for 변수 in 리스트 조건문]
3. 조건문 + for문
array = [조건문 for 변수 in 리스트]
4. 중첩 for문
array = [조건문 for 변수1 in 리스트1 for 변수2 in 리스트2 ...]
5. 중첩 list comprehension
기본 구조와 표현식 + for문 + 조건문
#for문을 돌려서 1~100까지의 숫자를 리스트에 넣으려면 list comprehension를 알기 전에는 이렇게 했을것이다
n = []
for i in range(1,101,1):
n.append((i))
print(n)
#이렇게 작성했을것이다 list comprehension을 적용하면
n = [i for i in range(1,101,1)] #기본구조
print(n)
#한줄로 끝내버릴수가 있다. 감이 오는가??? 더 많은 예시로 이해를 해보자
#여기서 5의 배수만 리스트에 넣고 싶다면
n = [i for i in range(1,101,1) if i%5 == 0] # 표현식 + for문 + 조건문
#이런식으로 쓸 수 있다. 조건문이 for문 뒤에 붙는 경우에는 단일 조건문 밖에 쓰지 못한다. else나 elif를 사용할 경우 문법 오류가 발생한다.
#하지만 if는 여러번 사용이 가능한데 이 경우에는 두 조건문이 and로 묶인 것과 같은 결과가 나온다
# 1~100까지에서 5의 배수이면서 10의 배수가 아닌경우
n = [i for i in range(1,101,1) if i%5 == 0 if i%10 != 0]
조건문 + for문
# 점수를 채점중이다 70점 이상은 합격, 미만은 불합격을 리스트로 만들려고한다
#list comprehension 적용 전
score = [73,61,99,100,21,45,70,68]
result = []
for i in score:
if i >= 70 : result.append('합격')
else : result.append('불합격')
print(result)
#list comprehension 적용 후
score = [73,61,99,100,21,45,70,68]
result = ['합격' if n>=70 else '불합격' for n in score]
print(result)
#코드가 매우 간결해지고 깔끔해졌다.
중첩 for문
# 구구단의 리스트를 생성하려고한다
# list comprehension 적용 전
gugu = []
for i in range(2,10):
for j in range(1,10):
gugu.append(i*j)
print(gugu)
# list comprehension 적용 후
gugu = [i*j for i in range(2,10) for j in range(1,10)]
print(gugu)
# 가장 밖에 나오게되는 for문부터 순서대로 적으면 된다.
중첩 List comprehension
# 2차원 배열을 중첩 list comprehension을 통해 선언할 수 있다.
result = [ [i for i in range(3)] for j in range(6)]
print(result)
밖에 있는 for문부터 확인해 나간다.
[i for i in range(3)] 즉 [0,1,2] 를 j 만큼 생성한다
당장은 이해하기 힘들수 있다. 자신의 코드에서 하나씩 list comprehension을 적용 해보면서 이해해보자
나의 경우엔 os.listdir 함수를 통해 폴더내 파일 목록 리스트를 가져올때 이와 같이 사용했다.
file_list = os.listdir(now_path)
file_name = [file for file in file_list if file.endswith('.csv')]
file_jpg = [file for file in file_list if file.endswith('.jpg')]
'파이썬 > Basic' 카테고리의 다른 글
파이썬 파일 및 폴더 다루기 : OS모듈 (0) | 2022.11.18 |
---|---|
파이썬 데이터 묶기 zip() (0) | 2022.11.18 |
파이썬 리스트 자료형 정복 (0) | 2022.11.16 |
파이썬 답게 코딩해보자 if condition (0) | 2022.11.13 |
셀레니움 Element 텍스트 값 가져오기 (0) | 2022.03.28 |