Stage2 - 조건에 따라서 데이터 수집하기

데이터를 수집하다보면 특정 조건을 만족하는 데이터만 수집하고 싶을 수 있습니다. 이번 스테이지에서는 특정조건에만 코드가 실행될 수 있도록 조건문을 공부합니다.

상황에 따라 다른 코드 실행하기; 조건문

조건문 if의 기본형태 이해하기

프로그래밍을 하다보면 상황에 따라 다른 코드를 실행시키고 싶을 때가 있습니다. 예를 들어 시급을 입력했을때, 최저시급보다 높은 경우 적절한 시급입니다 :) 를 출력하고, 최저시급보다 낮은 경우 최저임금보다 적어요 :(를 출력하는 프로그램을 만들어 봅시다.

파이썬의 조건문은 매우 직관적인 형태로 되어있습니다. 아래와 같이 코드를 작성한 후 코드를 실행해봅시다.

week5_2.py
pay = input("시급을 입력해주세요: ")
pay = int(pay)
if pay > 8350:
print("적절한 시급입니다 :)")
else:
print("최저임금보다 적어요 :(")

실행결과(9000을 입력) 시급을 입력해주세요: 9000 적절한 시급입니다 :)

실행결과(7000을 입력) 시급을 입력해주세요: 7000 최저임금보다 적어요 :(

9000을 입력한 경우와 7000을 입력한 경우 서로 다른 문자열이 출력되게 됩니다. if 구문의 기본적인 형태를 다시 한 번 살펴보면 아래와 같습니다.

if 조건(True/False):
# 실행문 1
# 실행문 1
# ...
else:
# 실행문 2
# 실행문 2
# ...

1지난 시간에 다룬 try/except문과 비슷한 구조를 띄고 있으며, if 뒤의 조건이 참인 경우에는 if 안의 실행문이 실행되고, 거짓인 경우에는 else 안의 실행문이 실행됩니다. try/except에서는 except가 필수였지만, if문에서는 else를 꼭 써줄 필요는 없습니다.

if문을 자유롭게 사용하기 위해서는 조건(True/False)에 대해 잘 이해하고 있어야합니다.

다양한 조건 이해하기 - 숫자의 비교

아래 코드를 작성하여 실행해봅시다.

week5_2.py
numbers = [7, 2, 3, 1, 10, 6, 4, 9, 8, 5]
for i in numbers:
if i > 5:
print(i)

실행결과 7 10 6 9 8

if 뒤의 조건이 i > 5이므로 5보다 큰 숫자들만 출력된 것을 확인할 수 있습니다. 이와 같이 우리가 일반적으로 생각하는 숫자의 비교는 모두 가능합니다.

비교연산자

설명

결과1

(A=3, B=1)

결과2

(A=2, B=2)

A > B

A가 B보다 크다.

True

False

A >= B

A가 B보다 크거나 같다.

False

True

A == B

A와 B가 같다.

False

True

A != B

A와 B가 같지않다.

True

False

파이썬에서 =은 같다가 아닌 할당의 의미였으므로, 같다의 의미를 가진 연산자는 ==으로 구분해서 사용합니다. 또한 >=, ==, !=과 같은 연산자는 꼭 붙여써야합니다.

다양한 조건 이해하기 - 논리연산

아래 코드를 작성해서 실행해봅니다.

week5_2.py
numbers = [7, 2, 3, 1, 10, 6, 4, 9, 8, 5]
for i in numbers:
if (i > 5) and (i%2 == 0):
print(i)
else:
print(i, "*")

실행결과 7 * 2 * 3 * 1 * 10 6 4 * 9 * 8 5 *

위 코드에서는 논리 연산자 and를 활용해서 i > 5이면서 동시에 i % 2 == 0인 경우(10, 6, 8)만 그대로 출력하고 아닌 경우에는 *을 함께 출력하고 있습니다.

if문에는 아래와 같이 조건과 조건을 비교하는 논리 연산자도 사용할 수 있습니다.

비교연산자

설명

결과1

(A=True, B=True)

결과2

(A=True, B=False)

A and B

A와 B가 둘다 참이다.

True

False

A or B

A 또는 B가 참이다.

True

True

not B

B가 거짓이다.

False

True

다양한 조건 이해하기 - 문자/리스트의 비교

아래 코드를 작성해서 실행해봅시다.

week5_2.py
#1. in 문자열
articles = ["손흥민은 손으로 상대의 얼굴을 밀며 맞받아쳤다.",
"AS로마의 니콜로 자니올로",
"이강인의 팀 동료 페란 토레스"]
for a in articles:
if "손흥민" in a:
print("손흥민이 나오는 기사")
elif "손흥민" not in a:
print("손흥민이 안나오는 기사")

실행결과 손흥민이 나오는 기사 손흥민이 안나오는 기사 손흥민이 안나오는 기사

위의 코드에서 articles에 저장된 각각 문자열에 손흥민이라는 단어가 들어있으면 손흥민이 나오는 기사를 출력하고, 들어있지 않으면 손흥민이 안나오는 기사를 출력합니다.

이와 같이 in이라는 비교연산자를 활용하면 문자의 포함여부를 쉽게 확인할 수 있습니다.

비교연산자

설명

A in 문자열

A가 문자열 안에 포함되어있다.

A not in 문자열

A가 문자열 안에 포함되어있지않다.

이번에는 아래 코드를 작성한 후 실행해봅니다.

week5_2.py
#2. in 리스트
players = ["손흥민", "이강인", "케빈하르", "백승호", "황의조"]
name = input("선수 이름을 입력해주세요: ")
if name in players:
print("출전하는 선수 입니다.")
elif name not in players:
print("출전하지 않는 선수입니다.")

실행결과(이강인을 입력한 경우) 선수 이름을 입력해주세요: 이강인 출전하는 선수입니다.

실행결과(이강을 입력한 경우) 선수 이름을 입력해주세요: 이강 출전하지 않는 선수입니다.

비교 연산자 in은 문자열 뿐만 아니라 리스트에서도 사용할 수 있습니다. 이 때는 리스트에 해당하는 값이 있을 때 True를 없을 때, False를 내보냅니다.

비교연산자

설명

A in 리스트

A가 리스트에 있다.

A not in 리스트

A가 리스트에 없다.

문자열 데이터에서 사용되는 in과 리스트 데이터에서 사용되는 in을 구분해야합니다. *문자열: 문자열 안에 일부가 포함되어 있을 때 *리스트: 리스트의 값 중에 해당하는 값이 있을 때

네이버 영화에 조건 추가하기

if문을 활용해서 평점과 장르에 따라 데이터 수집결과를 출력할 수 있도록 Stage1의 코드를 수정합니다. >> Stage1실습코드

평점 조건 추가하기

수집한 영화 데이터의 평점은 score변수에 저장되어 있습니다. 평점이 8.5 이상인 영화만 출력하기 위해서 아래와 같이 조건문을 추가합니다.

week5_1.py
... 생략
for m in movie:
# 영화별 데이터 수집하기
title = m.select_one("dt.tit a")
score = m.select_one("div.star_t1 span.num")
# nth-of-type을 활용해서 데이터를 선택합니다.
genre = m.select("dl.info_txt1 dd:nth-of-type(1) a")
directors = m.select("dl.info_txt1 dd:nth-of-type(2) a")
actors = m.select("dl.info_txt1 dd:nth-of-type(3) a")
#############################################
# 추가
if float(score.text) < 8.5:
continue
#############################################
# 구분선을 출력해줍니다.
print("="*50)
print("제목:", title.text)
... 생략

추가한 조건문을 통해 평점이 8.5보다 작을 때는 데이터를 출력하지 않습니다.

if float(score.text) < 8.5:
continue

추가된 조건을 자세히 살펴보면 먼저 score.text에는 평점이 문자형식으로 저장되어 있기 때문에 실수형(float)으로 형변환해줍니다. >> 데이터의 형변환

평점이 8.5보다 작은 경우에 continue가 실행되는데, continue는 반복문 안에서 현재의 실행문을 종료하고 다음 순서의 반복문이 실행되게합니다. 만약 1번 영화에 대한 데이터를 수집하는 중에 continue를 만나면 수집한 데이터를 출력하지 않고 2번 영화에 대한 데이터 수집으로 넘어가게 됩니다. 현재의 반복문을 건너뛴다고 생각하셔도 됩니다.

continue

자신이 속해있는 반복문을 다음 반복으로 넘깁니다.

* 주로 조건문 if와 함께 사용됩니다.

장르 조건 추가하기

평점과 같은 방식으로 장르조건도 추가할 수 있습니다. 다만, 평점 데이터는 명확하게 score.text 안에 저장되어 있지만, 장르의 경우 한 영화가 여러가지 장르를 가지고 있을 수 있기 때문에 genre 리스트가 가지고 있는 모든 값들을 확인해야합니다.

이를 개선하기 위해서 span.link_txt는 모든 장르에 대한 정보를 가지고 있기 때문에 새롭게 데이터를 수집해서 조건문을 사용하려고 합니다.

아래와 같이 코드를 수정하여 genre_all을 수집하고 액션 장르에 대한 수집결과만 출력할 수 있도록 조건문을 추가합니다.

week5_1.py
... 생략
for m in movie:
# 영화별 데이터 수집하기
title = m.select_one("dt.tit a")
score = m.select_one("div.star_t1 span.num")
# nth-of-type을 활용해서 데이터를 선택합니다.
genre = m.select("dl.info_txt1 dd:nth-of-type(1) a")
directors = m.select("dl.info_txt1 dd:nth-of-type(2) a")
actors = m.select("dl.info_txt1 dd:nth-of-type(3) a")
# 평점 조건 주석처리
# if float(score.text) < 8.5:
# continue
#############################################
# 추가
# genre_all을 수집
# "액션"장르가 아니면 continue
genre_all = m.select_one("dl.info_txt1 dd:nth-of-type(1) span.link_txt")
if "액션" not in genre_all.text:
continue
#############################################
# 구분선을 출력해줍니다.
print("="*50)
print("제목:", title.text)
... 생략

위와 같이 genre_all.text는 모든 장르에 대한 데이터를 하나의 텍스트 형태로 포함하고 있으므로, not in을 활용해서 조건문을 작성합니다.