티스토리 뷰

학습목표

이 장의 목표는 파이썬 리스트의 생성, 인덱싱, 연산, 메서드, 슬라이싱, 반복문 활용법을 익혀 여러 데이터를 효율적으로 관리하고 처리하는 능력을 기르는 것이다.

리스트란?

  • 리스트는 대괄호([]) 안에 쉼표로 구분된 값들의 모음으로 표현
    • my_list = [1, 2, 3, 4, 5]
  • 리스트는 다양한 데이터 유형을 포함할 수 있다.(문자열, 정수, 실수, 다른 리스트, 딕셔너리 등)
    • mixed_list = [1, 'apple', 3.14, [1, 2, 3], {'key': 'value'}]
  • 리스트는 변경 가능
    • 항목 수정: my_list[1] = 10
    • 항목 추가: my_list.append(6)
    • 항목 삭제: del my_list[2] 또는 my_list.remove(3)
  • 인덱싱 및 슬라이싱: 리스트의 항목은 0부터 시작하는 인덱스를 사용
    • 인덱싱: my_list[0] (첫 번째 항목)
    • 슬라이싱: my_list[1:3] (인덱스 1부터 2까지의 항목)
  • 길이: len() 함수를 사용하여 리스트의 길이(항목 수)를 얻을 수 있음
  • 중첩: 리스트 내부에 또 다른 리스트를 포함시킬 수 있음.
    • nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  • 메서드: 리스트는 여러 가지 유용한 메서드를 포함.

1. 리스트 생성

fruits = ['apple', 'banana', 'cherry']
numbers = [1, 2, 3, 4, 5]
mixed = [1, 'apple', True, 3.14]
  • 대괄호 []를 사용한다.
  • 문자열, 숫자, 불리언 등 자료형 혼합 가능하다.
  • 비어 있는 리스트는 empty = [] 또는 empty = list()로 만든다.
#빈 리스트에서는 특정 인덱스에 직접 값을 할당할 수 없으며, append 메서드를 사용하여 값을 추가해야 한다.
list3 = []
list3.append(1)
list3.append(2)
list3.append(3)
print(list3)

2. 리스트 indexing

fruits = ['apple', 'banana', 'cherry']
print(fruits[0])     # 'apple' (첫 번째)
print(fruits[-1])    # 'cherry' (마지막)

인덱스는 0부터 시작한다.
✅ 음수 인덱스는 뒤에서부터 센다.

list2 = [10,20,30,40]
list2[0]
list2[0] + list2[3]
50

3. 리스트 조작하기 (메서드)

- append() : 리스트의 끝에 새로운 항목을 추가
- extend() : 한 리스트의 모든 항목을 다른 리스트의 끝에 추가
- insert() : 지정된 위치에 항목을 삽입
- remove() : 리스트에서 첫 번째로 발견된 지정된 값의 항목을 삭제
- pop() : 지정된 인덱스의 항목을 삭제하고, 그 항목을 반환
- index() : 지정된 값의 첫 번째 항목의 인덱스를 반환
- count() :리스트에서 지정된 값의 항목의 수를 반환
- sort() : 리스트의 항목을 오름차순으로 정렬합니다. reverse=True 인자를 사용하여 내림차순으로 정렬
- reverse() : 리스트의 항목 순서를 반대로 바꿈
#append()
list1 = [1, 2, 3]
list1.append(4)
list1
# 결과: list1 = [1, 2, 3, 4]
list1 = [1, 2, 3]
list2 = [4, 5]
list1.extend(list2)
# 결과: list1 = [1, 2, 3, 4, 5]
list1 = [1, 2, 4]
list1.insert(2, 3)  # 2번 인덱스에 3을 삽입
# 결과: list1 = [1, 2, 3, 4]
list1 = [1, 2, 3, 2]
list1.remove(2)
# 결과: list1 = [1, 3, 2]
#pop지정된 인덱스의 항목을 삭제하고, 그 항목을 반환
list1 = [1,2,3,4]
a = list1.pop(2)
print(list1)
print(a)
b = list1.remove(4)
print(b)
print(list1)

결과

[1, 2, 4]
3
None
[1, 2]
list1 = [1, 2, 3, 2]
idx = list1.index(2)
# 결과: idx = 1
list1 = [1, 2, 3, 2, 2,2,2,]
list1.count(2)
# 결과: count_2 = 2
#sort() : 리스트의 항목을 오름차순으로 정렬합니다. reverse=True 인자를 사용하여 내림차순으로 정렬
list1 = [3, 1, 4, 2]
list1.sort()
# 결과: list1 = [1, 2, 3, 4]
#reverse() : 리스트의 항목 순서를 반대로 바꿈
list1 = [1, 2, 3, 4]
list1.reverse()
# 결과: list1 = [4, 3, 2, 1]

연습문제

1.리스트 길이 알아내기

  • 리스트의 길이는 리스트가 저장하고 있는 항목의 개수
  • len() 함수 사용
numbers =[1,2,3,4,5,6]
len(numbers)

2.리스트 내부에 있는지 확인하기

numbers = [1,2,3,4,5,6]
7 in numbers
#False
mylist = ['우유','사과','두부','소고기']
for item in mylist:
    print(item)
# 우유
# 사과
# 두부
# 소고기
mylist = ['우유','사과','두부','소고기']
print(len(mylist))
for i in range(len(mylist)):
    print(mylist[i])
# 4
# 우유
# 사과
# 두부
# 소고기

3.리스트를 정렬 해 봅시다.

  • sort()
  • sorted()
numbers=[9,6,7,1,8,4,5,3,2]
numbers.sort()
print(numbers)

 

numbers=[9,6,7,1,8,4,5,3,2]
new = sorted(numbers)
print(new)

4.리스트을 저장하고 항목의 평균을 계산 해 보자

  • 사용자로부터 5개의 숫자를 읽어서 리스트에 저장하고 숫자들의 평균을 계산하여 출력
alist = []         # 빈 리스트 생성
sum = 0            # 합계를 저장할 변수 초기화

for i in range(3):                 # 3번 반복
    i = int(input('점수입력:'))     # 점수를 입력받아 정수로 변환
    alist.append(i)                # 리스트에 추가

for i in alist:                    # 리스트의 각 값에 대해
    sum += i                       # sum에 더함

avg = sum / len(alist)             # 평균 계산

# 출력 1: 기본 print
print('합은', sum, '평균은', avg)

# 출력 2: % 포맷팅
print('합은 %s이고 평균은 %d' %(sum, avg))

# 출력 3: format 메서드
print('합은 {}이고, 평균은{}이다'.format(sum, avg))

# 출력 4: f-string (소수점 2자리)
print(f'합은 {sum}이고, 평균은 {avg:0.2f}이다.')

✅ alist.append(i) → 입력받은 값을 리스트에 넣는다.
✅ sum += i → 리스트 값을 하나씩 더한다.
✅ avg = sum / len(alist) → 리스트 길이로 평균을 계산한다.
✅ 출력 형식을 다르게 표현해 포맷팅 방식 비교 학습이 가능하다.


5.리스트 조작

  • 다음과 같이 문자열로 구성된 리스트를 생성하세요: ["apple", "banana", "cherry", "date", "elderberry"].
  • 반복문을 사용하여 리스트의 각 문자열의 길이를 계산하고, 각 문자열과 해당 길이를 함께 출력하세요.
apple: 5
banana: 6
cherry: 6
date: 4
elderberry: 10
fruits = ["apple", "banana", "cherry", "date", "elderberry"]

for fruit in fruits:
    length = len(fruit)
    print('{}:{} 글자'.format(fruit, length))   # format() 사용
    # 또는
    # print(f'{fruit}:{length} 글자')          # f-string 사용

✅ format() 방식 → 문자열 안에 {}를 넣고 .format()으로 값 채우기
✅ f-string 방식 → 문자열 앞에 f를 붙이고 {} 안에 변수 직접 넣기


6.팩토리얼 계산

  • 팩토리얼은 수학에서 사용되는 연산으로, 주어진 자연수 𝑛 n의 모든 양의 정수들의 곱을 의미
  • 사용자로부터 양의 정수 n을 입력 받으세요.
  • 1부터 n까지의 모든 정수를 곱하여 n의 팩토리얼을 계산하고 출력하세요. (예: 5! = 1 * 2 * 3 * 4 * 5)
n = int(input('양의 정수를 입력하세요: '))

factorial = 1

for i in range(1, n + 1):
    factorial *= i

print(f'{n}! = {factorial}')

✅ n = int(input(...)) → 사용자로부터 정수 입력받기
✅ factorial = 1 → 곱셈 결과를 담을 변수 초기화
✅ for i in range(1, n + 1): → 1부터 n까지 반복
✅ factorial *= i → 각 i를 누적 곱
✅ print(f'{n}! = {factorial}') → 최종 결과 출력


종합문제

1.퀴즈내기

주어진 코드는 두 개의 무한 루프를 사용하여 사용자로부터 입력을 받고, 정해진 조건을 만족하면 루프를 종료하는 예제입니다.

아무리 위를 봐도 보이지 않는 천장은 : 천장
아무리 위를 봐도 보이지 않는 천장은 : 입천장
꽃가게 주인이 가장 싫어하는 도시는 : 시드니
축하합니다.
while True:
    a = input("아무리 위를 봐도 보이지 않는 천장은 : ")
    if a == "입천장":
        break

while True:
    a = input("꽃가게 주인이 가장 싫어하는 도시는 : ")
    if a == "시드니":
        break

print("축하합니다.")

1️⃣ 첫 번째 while 루프
→ 질문: 아무리 위를 봐도 보이지 않는 천장은?
→ 정답: 입천장 (입 안에 있어서 고개를 들어도 안 보임)
→ 정답을 맞출 때까지 반복

2️⃣ 두 번째 while 루프
→ 질문: 꽃가게 주인이 가장 싫어하는 도시는?
→ 정답: 시드니 (씨드니 = 씨앗이 다 시드는 곳)
→ 정답을 맞출 때까지 반복

3️⃣ 두 문제를 모두 맞히면
→ print("축하합니다.") 출력


2.종료조건지정

마지막 숫자는 : 4
뛰어넘을 숫자는 : 3
0
1
2
4
주어진 코드는 사용자로부터 두 개의 숫자를 입력받아, 0부터 첫 번째 숫자까지의 범위에서 두 번째 숫자를 뛰어넘고 출력하는 예제입니다. continue 문을 사용하여 특정 숫자를 뛰어넘고 나머지 숫자들을 출력합니다.
a = int(input("마지막 숫자는: "))
b = int(input("뛰어넘을 숫자는: "))

for i in range(a + 1):
    if i == b:
        continue
    print(i)

1️⃣ 입력

  • a: 출력할 마지막 숫자
  • b: 출력에서 건너뛸 숫자

2️⃣ for 반복문

  • range(a + 1) → 0부터 a까지 반복

3️⃣ 조건

  • if i == b: → 현재 숫자가 b이면 continue (출력하지 않고 다음 반복으로 넘어감)

3.업다운게임

  • 숫자 하나를 정하고 그 숫자를 입력할 때까지 프로그램 반복
import random

answer = random.randint(1, 100)  # 1~100 사이 난수 생성

while True:
    guess = int(input("숫자를 맞혀보세요 (1~100): "))
    
    if guess < answer:
        print("업!")
    elif guess > answer:
        print("다운!")
    else:
        print("정답입니다!")
        break

✅ random.randint(1, 100) → 1~100 사이의 랜덤 숫자 선택
✅ while True: → 무한 반복
✅ if-elif-else → 입력한 숫자가 작으면 "업!", 크면 "다운!", 같으면 "정답!"

업다운 게임 (시도 횟수 + 범위 안내 추가)

import random

answer = random.randint(1, 100)  # 1~100 사이 난수 생성
tries = 0                        # 시도 횟수

min_num = 1
max_num = 100

print(f"{min_num}부터 {max_num} 사이의 숫자를 맞혀보세요!")

while True:
    guess = int(input(f"숫자를 입력하세요 ({min_num}~{max_num}): "))
    tries += 1

    if guess < min_num or guess > max_num:
        print("범위를 벗어난 숫자입니다. 다시 입력하세요.")
        continue

    if guess < answer:
        print("업!")
        min_num = guess + 1  # 최소값 업데이트
    elif guess > answer:
        print("다운!")
        max_num = guess - 1  # 최대값 업데이트
    else:
        print(f"정답입니다! {tries}번 만에 맞혔습니다!")
        break

시도 횟수 → tries 변수로 몇 번 시도했는지 기록
범위 제한 → 현재 최소값(min_num), 최대값(max_num)을 안내하고 벗어나면 경고
범위 업데이트 → 업/다운할 때 최소값·최대값을 좁혀서 안내

728x90
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
반응형