2025.02.28 본_캠프 9일차

민동·2025년 2월 28일
0

본캠프

목록 보기
10/74
post-thumbnail

리스트, 튜플, 딕셔너리

기대효과

데이터를 자유자재로 다룰 수 있고 정리할 수 있다.

리스트(List)

리스트는 파이썬에서 가장 자주 사용되는 데이터 구조 중 하나로, 가변(mutable)한 시퀀스(sequence) 구조를 가진다. 즉, 리스트 내부의 값을 변경할 수 있다.

리스트의 특징

  • 여러 값을 순서대로 저장할 수 있음
  • 대괄호 [ ]를 사용하여 생성
  • 각 요소는 쉼표 ,로 구분
  • 인덱스를 사용하여 특정 값에 접근 가능

리스트와 튜플의 차이

  • 리스트(List): 특정 한 값을 바꾸는 것이 가능함
  • 튜플(Tuple): 특정 한 값만 바꾸는 것이 불가능함 (불변, immutable)

리스트 인덱싱

  • 리스트에서 특정 값에 접근할 때 사용
  • 파이썬은 0부터 시작
  • 뒤에서부터 접근할 경우 음수 인덱스 사용 (-1은 마지막 요소)
  • 범위를 벗어난 인덱싱은 오류 발생
# 리스트 생성
numbers = [1, 2, 3, 4, 5]

# 첫 번째 요소에 접근하기
print(numbers[0])  # 출력: 1

# 마지막 요소에 접근하기
print(numbers[-1])  # 출력: 5

리스트 메서드 정리

메서드설명
append(x)리스트에 항목 x 추가
extend(iterable)리스트에 또 다른 리스트의 항목 추가
insert(i, x)리스트의 특정 위치 i에 항목 x 삽입
pop(i)리스트에서 특정 위치 i의 값을 제거하고 반환
index(x)리스트에서 특정 값 x의 인덱스를 찾음
count(x)리스트에서 특정 값 x의 개수를 셈
sort()리스트의 항목들을 정렬
reverse()리스트의 항목들을 역순으로 변경
# 리스트 생성
my_list = [1, 2, 3, 4, 5]

# 값 추가
my_list.append(6)  # [1, 2, 3, 4, 5, 6]
my_list.extend([7, 8, 9])  # [1, 2, 3, 4, 5, 6, 7, 8, 9]
my_list.insert(2, 10)  # [1, 2, 10, 3, 4, 5, 6, 7, 8, 9]

# 값 삭제
my_list.remove(3)  # 값 3 삭제
popped_value = my_list.pop(5)  # 다섯 번째 위치 값 제거 후 반환
print(popped_value)  # 출력: 6

# 리스트 정렬
my_list.sort()  # [1, 2, 4, 5, 7, 8, 9, 10]
my_list.reverse()  # [10, 9, 8, 7, 5, 4, 2, 1]

리스트 값 삭제

리스트에서 특정 값을 삭제하거나 전체를 삭제하는 방법

# 리스트 항목 삭제
del my_list[0]  # 첫 번째 항목 삭제
print(my_list)

# 리스트 전체 삭제
my_list.clear()
print(my_list)  # 출력: []

SQL 공부 정리

오늘 학습한 SQL 문제 풀이 정리

각 문제의 쿼리문과 설명을 포함하여 기록한다.

1. userspayment 테이블 활용

사용자는 users 테이블과 payment 테이블을 활용하여 다양한 SQL 문제를 풀이하였다.

-- 특정 기간 동안 결제한 유저들의 평균 결제 금액
SELECT user_id, ROUND(AVG(amount), 2) AS avg_payment
FROM payment
WHERE approval_date BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY user_id
HAVING AVG(amount) > 1000;

설명:

  • 특정 기간 동안(approval_date 기준) 결제한 유저들의 평균 결제 금액을 구함
  • HAVING 절을 활용하여 평균 결제 금액이 1000 이상인 유저만 출력
-- 게임 계정별 첫 로그인 날짜 구하기
SELECT account_id, MIN(first_login_date) AS first_login
FROM users
GROUP BY account_id;

설명:

  • 각 게임 계정(account_id) 별로 최초 로그인 날짜(first_login_date)를 구함
  • MIN() 함수를 사용하여 첫 로그인 날짜를 찾음
-- 가장 많이 결제한 유저 찾기
SELECT user_id, SUM(amount) AS total_spent
FROM payment
GROUP BY user_id
ORDER BY total_spent DESC
LIMIT 1;

설명:

  • SUM(amount)를 이용해 유저별 총 결제 금액을 구함
  • ORDER BY total_spent DESC로 정렬하여 가장 많이 결제한 유저를 찾음
  • LIMIT 1을 사용하여 상위 1명만 출력

이처럼 리스트, 튜플, 딕셔너리 등의 데이터 구조를 이해하고 활용하면, 데이터 분석 및 SQL에서도 효율적으로 데이터를 다룰 수 있다. 앞으로도 다양한 문제를 통해 SQL 실력을 쌓아 나가자!


1. 서울에 위치한 식당 목록 출력하기

문제 개요

  • REST_INFOREST_REVIEW 테이블에서 서울에 위치한 식당 목록을 조회.
  • 리뷰 평균 점수를 소수점 두 번째 자리에서 반올림.
  • 평균 점수를 기준으로 내림차순 정렬, 같으면 즐겨찾기 수 기준 내림차순 정렬.

사용한 SQL

SELECT I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS, ROUND(AVG(R.REVIEW_SCORE),2) SCORE
FROM REST_INFO I 
INNER JOIN REST_REVIEW R ON I.REST_ID = R.REST_ID
WHERE I.ADDRESS LIKE '서울%'
GROUP BY I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS
ORDER BY SCORE DESC, I.FAVORITES DESC;

쿼리 설명

  1. INNER JOIN을 사용하여 REST_INFOREST_REVIEW 테이블을 REST_ID 기준으로 조인한다.
  2. WHERE I.ADDRESS LIKE '서울%'을 사용하여 서울에 위치한 식당을 필터링한다.
  3. AVG(R.REVIEW_SCORE)를 사용하여 식당별 평균 리뷰 점수를 계산하고, ROUND(AVG(R.REVIEW_SCORE),2)를 사용하여 소수점 둘째 자리에서 반올림한다.
  4. GROUP BY를 사용하여 REST_ID 기준으로 그룹화한다.
  5. ORDER BY SCORE DESC, I.FAVORITES DESC를 사용하여 평균 점수 기준 내림차순 정렬, 같다면 즐겨찾기 수 기준 내림차순 정렬한다.

2. 자동차 대여 기록에서 장기/단기 대여 구분하기

문제 개요

  • CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 9월에 대여 시작한 기록 조회.
  • 대여 기간이 30일 이상이면 ‘장기 대여’, 그렇지 않으면 ‘단기 대여’로 표시.
  • 대여 기록 ID를 기준으로 내림차순 정렬.

사용한 SQL

SELECT HISTORY_ID,
       CAR_ID,
       DATE_FORMAT(START_DATE,'%Y-%m-%d') START_DATE,
       DATE_FORMAT(END_DATE, '%Y-%m-%d') END_DATE,
       CASE WHEN DATEDIFF(END_DATE, START_DATE) >= 29 THEN '장기 대여'
            ELSE '단기 대여' END RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE START_DATE LIKE '2022-09%'
ORDER BY HISTORY_ID DESC;

쿼리 설명

  1. WHERE START_DATE LIKE '2022-09%'을 사용하여 9월에 대여 시작한 기록만 조회한다.
  2. DATEDIFF(END_DATE, START_DATE)를 사용하여 대여 기간을 계산한다.
  3. CASE WHEN을 사용하여 30일 이상이면 ‘장기 대여’, 그렇지 않으면 ‘단기 대여’로 분류한다.
  4. ORDER BY HISTORY_ID DESC를 사용하여 대여 기록 ID 기준 내림차순 정렬한다.

3. 자동차 평균 대여 기간 구하기

문제 개요

  • CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 자동차별 평균 대여 기간을 구한다.
  • 평균 대여 기간이 7일 이상인 경우만 출력.
  • 소수점 첫째 자리에서 반올림.
  • 평균 대여 기간 기준 내림차순 정렬, 같다면 자동차 ID 기준 내림차순 정렬.

사용한 SQL

SELECT CAR_ID,
       ROUND(AVG(DATEDIFF(END_DATE, START_DATE) + 1), 1) AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVERAGE_DURATION >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;

쿼리 설명

  1. DATEDIFF(END_DATE, START_DATE) + 1을 사용하여 대여 시작일을 포함하여 대여 기간을 계산한다.
  2. AVG()를 사용하여 자동차별 평균 대여 기간을 구한다.
  3. ROUND(AVG(...), 1)을 사용하여 소수점 첫째 자리에서 반올림한다.
  4. HAVING AVERAGE_DURATION >= 7을 사용하여 7일 이상인 자동차만 필터링한다.
  5. ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC을 사용하여 평균 대여 기간 기준 내림차순 정렬, 같다면 자동차 ID 기준 내림차순 정렬한다.

4. 헤비 유저가 소유한 장소 조회

문제 개요

  • PLACES 테이블에서 공간을 2개 이상 등록한 사용자(헤비 유저)의 공간 정보를 조회.
  • ID 기준 오름차순 정렬.

사용한 SQL

SELECT ID, NAME, HOST_ID
FROM PLACES
WHERE HOST_ID IN (
    SELECT HOST_ID
    FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(ID) >= 2
)
ORDER BY ID;

쿼리 설명

  1. HAVING COUNT(ID) >= 2을 사용하여 2개 이상 공간을 등록한 사용자만 선택한다.
  2. WHERE HOST_ID IN (...)을 사용하여 헤비 유저가 등록한 공간만 조회한다.
  3. ORDER BY ID를 사용하여 공간 ID 기준 오름차순 정렬한다.

5. 우유와 요거트가 담긴 장바구니 조회

문제 개요

  • CART_PRODUCTS 테이블에서 Milk와 Yogurt가 모두 포함된 장바구니 ID 조회.
  • 장바구니 ID 기준 오름차순 정렬.

사용한 SQL

SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ('Milk', 'Yogurt')
GROUP BY CART_ID
HAVING COUNT(DISTINCT NAME) = 2
ORDER BY CART_ID;

쿼리 설명

  1. WHERE NAME IN ('Milk', 'Yogurt')을 사용하여 Milk 또는 Yogurt가 포함된 데이터만 필터링한다.
  2. GROUP BY CART_ID를 사용하여 장바구니별로 묶는다.
  3. HAVING COUNT(DISTINCT NAME) = 2을 사용하여 Milk와 Yogurt가 둘 다 포함된 경우만 선택한다.
  4. ORDER BY CART_ID를 사용하여 장바구니 ID 기준 오름차순 정렬한다.

오늘의 학습 요약

오늘 학습한 SQL을 통해 다양한 필터링 및 집계 기법을 활용할 수 있었다.

  • JOIN을 활용한 데이터 결합
  • HAVING COUNT(DISTINCT COLUMN)을 사용한 특정 조건 필터링
  • DATEDIFF 및 ROUND을 활용한 날짜 계산
  • WHERE IN (서브쿼리)을 활용한 특정 조건 만족 데이터 조회
  • CASE WHEN을 활용한 조건별 데이터 변환
  • GROUP BY와 AVG, COUNT 등의 집계 함수 활용

.

profile
아자아자

0개의 댓글