코딩의 기록

따라하며 배우는 파이썬과 데이터과학 7장 심화문제

모루우 2025. 1. 20. 14:12
728x90
반응형

1.

num_list = [100, 200, 300, 400, 500, 600, 700, 800]
high = 6
low = 3

print(num_list[high])
print(num_list[high - 2])
print(num_list[high - low])
print(num_list[low - high])
print(num_list[-1])
print(num_list[-low])
print(num_list[2 * 3])
print(num_list[2] * 3)
print()
print(num_list[5 % 4])
print(len(num_list))
print(min(num_list))
print(max(num_list))
print(num_list[:3])
print(num_list[1:5])
print(num_list[-1:-5:-1])
print(num_list[-5:-1:1])

 

2.

list1 = [3, 5, 7]
list2 = [2, 3, 4, 5, 6]

for x in list1:
    for y in list2:
        print(x, "*", y, "=", x * y)

 

3.

list1 = ['I like ', 'I love ']
list2 = ['pancakes.', 'kiwi juice,', 'espresso.']

for x in list1:
    for y in list2:
        print(x + y)

 

4.

# 튜플이라서 안되는 것임 튜플은 변경될 수 없는 불변속성 객체이므로 remove append 같이 요소를 변경하는 것은 안됨

t = [10, 20, 30, 40]
t.append(50)
t.remove(40)
t[0] = 0

 

5.

sit_list = []

for x in ('A', 'B', 'C'):
    for y in ('1', '2'):
        sit_list.append(x + y)

print(sit_list)
sit_list = []

for x in ('A', 'B', 'C'):
    for y in (1, 2):
        sit_list.append(x + str(y))

print(sit_list)

 

6.

user = input("문자열을 입력하세요: ")

for i in range(1, len(user)+1):
    print(user[0:i])

for i in range(1, len(user)):
    print(user[0:len(user) - i])

 

7.

fruit_list = ['banana', 'orange', 'kiwi', 'apple', 'melon']

def remover(list):
    maximum = len(max(list, key=len)) #길이가 가장 긴 요소를 찾아냄

    print("가장 길이가 긴 문자열 : ", end = "")

    for x in list[:]: #이렇게 하는 이유는 리스트에서 요소가 삭제되면 리스트의 길이가 즉시 변경되어 banana 뒤의 orange가 건너뛰어져서 orange가 삭제되지 않음 그래서 리스트를 새로 복사해서 원본을 삭제해주는 것
        if len(x) == maximum:
            list.remove(x)
            print(x, end = " ")

    print()
    print(list)


remover(fruit_list)

이거를 하면서 몇가지 물어봤는데(다른 사람의 잘못된 코드라던가, 저기 주석에 적힌 key, list[:] 같은 방법들) 챗지피티는 진짜 똑똑한거 같다 질문만 잘하면 겁나 잘가르쳐준다 미친  개떡같이 말한거 같아도 찰떡같이 알아들어서 가르쳐주고 ㄷㄷ

fruit_list = ['banana', 'orange', 'kiwi', 'apple', 'melon']

def printer(list):
    for x in list:
        print('{0:6s}'.format(x), ": 문자열의 길이", len(x))

printer(fruit_list)

포매팅이 역시 s도 된다

 

8.

def snake(n):
    list = [x for x in range(1,n**2 + 1)]

    for i in range(1, n + 1):
        if i % 2 != 0:
            list1 = list[n * (i - 1): n * i]
            for x in list1:
                print("{0:2d}".format(x), end = " ")
        else:
            list1 = list[n * i - 1: n * (i -1) - 1:-1]
            for x in list1:
                print("{0:2d}".format(x), end=" ")
        print("")


n = int(input("n을 입력하시오 : "))
snake(n)

 

나는 이렇게 짰지만 채찍피티한테 물어보니까 사실 if else문을 쓸 필요도 없이 (+ 코드 가독성을 위해 0번째도 짝수로 처리하면) 그냥 i * n 부터 (i+1) * n 까지 슬라이싱을 한다음에 홀수면 역순으로만 출력해주면 된다

 

그리고 join()을 이용하여 반복문을 한번 더 사용하지 않고 리스트를 하나의 문자열로 만들어서 바로 출력함

join() : join()은 파이썬 문자열 메서드로, 리스트(또는 다른 반복 가능한 객체)의 요소들을 하나의 문자열로 합칠 때 사용됩니다. 이 메서드는 문자열과 문자열 사이에 원하는 구분자를 삽입하여 합칠 수 있는 강력하고 유용한 도구

 

def snake(n):
    # 1부터 n^2까지 숫자를 리스트로 생성
    numbers = [x for x in range(1, n**2 + 1)]

    for i in range(n):
        # 행별로 슬라이싱 (짝수는 오름차순, 홀수는 내림차순)
        row = numbers[i * n:(i + 1) * n]
        if i % 2 != 0:  # 짝수 번째 행이면 내림차순
            row = row[::-1]

        # 출력
        print(" ".join(f"{x:2d}" for x in row))


# 사용자 입력 및 함수 호출
n = int(input("n을 입력하시오 : "))
snake(n)

 

여기서 f"{}"는 f-string 이라고 format의 진화판인가?

 

  • 파이썬 3.6 이상에서 사용 가능한 문자열 포매팅 방법입니다.
  • 문자열 앞에 f를 붙이고, 중괄호 {} 안에 변수를 직접 삽입합니다.

 

그리고 join 뒤에 굳이 for 문을 넣은 이유는 join이 숫자는 안되고 문자열만 가능하기 때문임

그리고 f" " for x in row 는 제네레이션 표현식이라고 한다..

 

9.

def overlap(a, b):
    count = 0
    for i in range(len(a)):
        if a[i] == b[count]:
            count += 1

    print(a + b[count:])

a = input("문자열 a를 입력하시오: ")
b = input("문자열 b를 입력하시오: ")

overlap(a, b)

여기서 count의 역할이 중요한데 count가 늘어났다는건 a의 어느 글자 부분이 b의 첫글자와 같다는 것

그러나 결국 a의 글자 끝까지 같아야지 합칠 수 있으므로 마지막 count 만이 의미가 있고 이 카운트는 b문자열을 어디서 부터 자를지 기준이 되는 역할을 함

근데 잘못한게 초기화를 안시켜줬다 else로 안맞으면 초기화 시켜줘야 할듯

근데 이거의 문제가 b문자열을 count하는게 초과할 수도 있다는 문제점이 있다

예를들어서 commu mm 이면 앞에서 찾다가 mm이 같으니까 count는 2가 되는데 2는 없으므로 오류가 날 수도 있음

물론 try-catch를 사용해서 이럴 경우 안되는 걸로 간주하고 넘길 수도 있지만

사실 챗지피티한테 물어보니까 for문의 i를 마음대로 조작하는 것은 좋은 방법이 아니라고 해서 그냥 안하는게 맞는듯

 

슬라이싱은 자르는 범위가 넘어가도 out of range 오류가 뜨지 않음

def overlap(A, B):
    # A와 B의 최대 겹치는 길이를 찾기 위한 반복문
    for i in range(len(A)):
        # A의 끝에서 i개의 문자와 B의 처음에서 i개의 문자가 일치하는지 비교
        if A[i:] == B[:len(A) - i]:
            # 겹치는 부분이 있으면 그 부분을 잘라서 합침
            return A + B[len(A) - i:]

    # 겹치는 부분이 없으면 그냥 두 문자열을 이어서 반환
    return A + B

# 사용자 입력
A = input('A = ')
B = input('B = ')

# 결과 출력
print('C =', overlap(A, B))

 

내 코드의 문제점은 위에서 말한 문제점이 있어서 그냥 슬라이싱해서 같은지 비교하는게 더 쉬운듯

 

요약

1. max는 키 값을 줄 수 있는데 len으로 하면 문자열이 가장 긴 것을 뽑는다

2. f-string은 진화된 format으로 {}안에 변수를 넣을 수 있음

3.  join()은 파이썬 문자열 메서드로, 리스트(또는 다른 반복 가능한 객체)의 요소들을 하나의 문자열로 합칠 때 사용

728x90
반응형