배꼽파지 않도록 잘 개발해요

[코드잇] 파이썬 프로그래밍 기초 - 프로그래밍과 데이터 in Python 본문

코드잇 Codeit/Python / ML / DL

[코드잇] 파이썬 프로그래밍 기초 - 프로그래밍과 데이터 in Python

꼽파 2023. 7. 31. 22:43


  • 1. 리스트

  • 2. for 반복문

  • 3. 사전

  • 4. 파이썬 데이터의 비밀

  • 1. 리스트

    리스트

    # 리스트 (list)
    numbers = [2, 3, 5, 7, 11, 13]  # 정수형 리스트
    names = ["윤수", "혜린", "태호", "영훈"]
    # 3은 numbers 리스트의 요소
    # 태호는 names 리스트의 요소
    
    print(numbers)
    # [2, 3, 5, 7, 11, 13]
    print(names)
    # ['윤수', '혜린', '태호', '영훈']
    
    
    """
    인덱스(index) : 리스트에서 요소의 위치
    인덱싱(indexing) : 인덱스를 통해 요소를 받아오는 것
    """
    """
    ◆ 인덱싱
    """
    
    # 인덱스 번호 직접 지정
    print(numbers[1] + numbers[3])
    # 3 + 7 = 10
    
    # 변수에 인덱스 값을 저장
    num_1 = numbers[1]
    num_3 = numbers[3]
    print(num_1 + num_3)
    # 3 + 7 = 10
    
    # 리스트에 없는 인덱스를 불러옴
    """
    print(numbers[6])
    → 오류 (인덱스 범위를 벗어남)
    """
    print(numbers[0])   # 2  (첫번째 요소)
    print(numbers[-1])  # 13 (마지막 요소)
    print(numbers[-2])  # 11
    # print(numbers[-7])  # 오류
    # 리스트 (list)
    numbers = [2, 3, 5, 7, 11, 13] 
    names = ["윤수", "혜린", "태호", "영훈"]
    
    """
    ◆ 리스트 슬라이싱 (list slicing)
    """
    numbers[0:4]  # 인덱스 0부터 3까지 자름
    print(numbers[0:4])  # [2, 3, 5, 7]
    
    # *** 주의 : 0:4는 인덱스 3까지임!
    
    numbers[2:]  # 뒷부분 비어있으면 마지막까지 
    print(numbers[2:])  # [5, 7, 11, 13]
    
    numbers[:3]  # 앞부분 비어있으면 처음부터 
    print(numbers[:3])  # [2, 3, 5]
    
    new_list = numbers[:3]  # [2, 3, 5]
    print(new_list[2])  # 5
    
    # 리스트 요소 바꾸기
    numbers[0] = 7
    print(numbers)  # [7, 3, 5, 7, 11, 13]
    
    numbers[0] = numbers[0] + numbers[1]  # numbers[0] = 7 + 3
    print(numbers)  # [10, 3, 5, 7, 11, 13]

     

    리스트 함수

    numbers = []
    
    # len : 리스트 길이
    print(len(numbers))  # 0
    
    # append : 리스트에 값 추가 (오른쪽 끝부터 추가)
    numbers.append(5)
    numbers.append(8)
    print(numbers)  # [5, 8]
    print(len(numbers))  # 2
    numbers = [2, 3, 5, 7, 11, 13, 17, 19]
    
    # del : 리스트 요소 삭제
    del numbers[3]  # 인덱스 3번 요소 (7) 삭제
    print(numbers)  # [2, 3, 5, 11, 13, 17, 19]
    
    # insert : 원하는 위치에 값 삽입
    numbers.insert(4, 37)
    print(numbers)  # [2, 3, 5, 11, 37, 13, 17, 19]
    
    """
    append : 추가연산
    insert : 삽입연산
    """

     

    리스트 정렬

    sorted : 기존 리스트는 건들이지 않고, 정렬된 새로운 리스트를 리턴
    sort : 아무것도 리턴하지 않고, 기존 리스트를 정렬

    numbers = [19, 13, 2, 5, 3, 11, 7, 17]
    
    """
    sorted
    """
    
    # 오름차순
    new_list = sorted(numbers)
    print(new_list)
    # [2, 3, 5, 7, 11, 13, 17, 19]
    
    # 내림차순
    reversed_list = sorted(numbers, reverse=True)
    print(reversed_list)
    # [19, 17, 13, 11, 7, 5, 3, 2]
    
    print(numbers)
    # [19, 13, 2, 5, 3, 11, 7, 17]
    # 원래의 리스트를 그대로 출력함
    
    """
    sort
    """
    
    print(numbers.sort())
    # None
    """
    sort는 아무것도 리턴하지 않음
    numbers 리스트 자체를 정렬함
    정렬된 리스트를 보고 싶으면
    numbers.sort()를 print할 게 아니라
    numbers.sort()를 하고 numberes를 print 해야 함.
    """
    
    numbers.sort(reverse=True)
    print(numbers)
    # [19, 17, 13, 11, 7, 5, 3, 2]

     

    리스트 인덱싱 연습

    greetings = ["안녕", "니하오", "곤니찌와", "올라", "싸와디캅", "헬로", "봉주르"]
    
    i = 0
    
    while i < len(greetings):  # len(greetings)는 원소의 개수라서 7임
        print(greetings[i])
        i += 1

     

    온도 단위 바꾸기

    # 화씨 온도에서 섭씨 온도로 바꿔 주는 함수
    def fahrenheit_to_celsius(fahrenheit):
        celsius = (fahrenheit - 32) * 5 / 9
        return round(celsius, 1)
    
    temperature_list = [40, 15, 32, 64, -4, 11]
    print("화씨 온도 리스트: {}".format(temperature_list))  # 화씨 온도 출력
    
    # 리스트의 값들을 화씨에서 섭씨로 변환하는 코드
    i = 0
    while i < len(temperature_list):
        temperature_list[i] = fahrenheit_to_celsius(temperature_list[i])
        i += 1
    
    print("섭씨 온도 리스트: {}".format(temperature_list))
    """
    모범답안
    """
    
    
    # 화씨 온도에서 섭씨 온도로 바꿔 주는 함수
    def fahrenheit_to_celsius(fahrenheit):
        return (fahrenheit - 32) * 5 / 9
    
    temperature_list = [40, 15, 32, 64, -4, 11]
    print("화씨 온도 리스트: {}".format(temperature_list))  # 화씨 온도 출력
    
    
    # 리스트의 값들을 화씨에서 섭씨로 변환하는 코드
    i = 0
    while i < len(temperature_list):
        temperature_list[i] = round(fahrenheit_to_celsius(temperature_list[i]), 1)
        i += 1
    
    print("섭씨 온도 리스트: {}".format(temperature_list))  # 섭씨 온도 출력

    리스트의 원소를 넣어줄 때 round함수를 적용하여 코드의 길이가 짧아짐.

     

    리스트 함수 활용하기

    # 빈 리스트 만들기
    numbers = []
    print(numbers)
    
    
    # numbers에 값들 추가
    numbers.append(1)
    numbers.append(7)
    numbers.append(3)
    numbers.append(6)
    numbers.append(5)
    numbers.append(2)
    numbers.append(13)
    numbers.append(14)
    print(numbers)
    
    
    # numbers에서 홀수 제거
    numbers = [num for num in numbers if num % 2 == 0]
    print(numbers)
    
    i = 0
    while i < len(numbers):
        if numbers[i] % 2 == 1:  # 홀수일 경우 해당 요소 삭제
            del numbers[i]
        else:  # 짝수일 경우 인덱스 번호 하나 늘려준다
            i += 1
    print(numbers)
    
    
    # numbers의 인덱스 0 자리에 20이라는 값 삽입
    numbers.insert(0, 20)
    print(numbers)
    
    
    # numbers를 정렬해서 출력
    numbers = sorted(numbers)
    print(numbers)
    
    numbers.sort()
    print(numbers)

     

    리스트 꿀팁

    리스트에서 값의 존재 확인하기

    primes = [2, 3, 5, 7, 11, 13, 17, 19, 23]
    
    print(7 in primes)  # False
    print(12 in primes)  # True
    primes = [2, 3, 5, 7, 11, 13, 17, 19, 23]
    
    print(6 not in primes)  # True
    print(13 not in primes)  # False


    리스트 안의 리스트 (Nested List)

    # 세 번의 시험을 보는 수업
    grades = [[62, 75, 77], [78, 81, 86], [85, 91, 89]]
    
    # 첫 번째 학생의 성적
    print(grades[0])  # [62, 75, 77]
    
    # 세 번째 학생의 성적  
    print(grades[2])  # [85, 91, 89]
    
    # 첫 번째 학생의 첫 번째 시험 성적
    print(grades[0][0])  # 62
    
    # 두 번째 학생의 세 번째 시험 성적
    print(grades[1][2])  # 86
    
    # 첫 번째 시험의 평균
    print((grades[0][0] + grades[1][0] + grades[2][0]) / 3)  # 75.0


    sort 메소드

    .sort()는 새로운 리스트를 생성하지 않고 해당 리스트를 정렬된 상태로 바꿔줌.

    # 오름차순 정렬
    numbers = [5, 3, 7, 1]
    numbers.sort()
    print(numbers)
    # [1, 3, 5, 7]

     

    reverse 메소드

    리스트 원소들을 뒤집어진 순서로 출력함.

    # 원소들을 거꾸로 뒤집음
    list = [2, 5, 3, 1, 11]
    list.reverse()
    print(list)
    # [11, 1, 3, 5, 2]

     

    index 메소드

    해당 원소의 인덱스 값을 반환함.

    food = ["pizza", "hamburger", "chicken", "noodle"]
    print(food.index("pizza"))  # 0
    print(food.index("noodle"))  # 3

     

    remove 메소드

    첫번째로 해당 값을 가지고 있는 원소를 삭제함. (중복인 경우 첫번째로 있는 것만 삭제)

    fruits = ["딸기", "당근", "파인애플", "수박", "참외", "파인애플", "메론"]
    fruits.remove("파인애플")
    print(fruits)
    
    # ['딸기', '당근', '수박', '참외', '파인애플', '메론']

    2. for 반복문

    for 반복문

    while과 for 반복문으로 할 수 있는게 거의 똑같음
    상황에 따라 for문을 쓰는 게 while문을 쓰는 것보다 코드가 더 깔끔할 수 있음.

    # for문
    
    my_list = [2, 3, 5, 7, 11]
    
    for number in my_list:
        print(number)
    
    
    # while문
    
    my_list = [2, 3, 5, 7, 11]
    
    i = 0
    while i < len(my_list):
        print(my_list[i])
        i += 1

     

    range 함수

    # range 함수
    
    range() ---> 파라미터 1개 버전
    range( , ) ---> 파라미터 2개 버전
    range( , , ) ---> 파라미터 3개 버전
    
    ----------------------------------------
    ◆ 파라미터 2개 버전
    
    for i in range(start, stop):
        print(i)
    → start 부터 stop-1까지의 범위
    
    ex. 
    for i in range(3, 11):
        print(i)
    
    for i in [3, 4, 5, 6, 7, 8, 9, 10]:
        print(i)
    
    ------------------------------------------
    ◆ 파라미터 1개 버전
    
    for i in range(stop):
        print(i)
    → 0부터 stop-1까지의 범위
    
    ex.
    for i in range(10):
        print(i)
    
    for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
        print(i)
        
    ------------------------------------------
    ◆ 파라미터 3개 버전
    
    for i in range(start, stop, step):
        print(i)
    → start부터 stop-1까지의 범위, 간격 step
    
    ex.
    for i in range(3, 17, 3):
        print(i)
    → 정수 3부터 16까지 3씩 
    
    for i in [3, 6, 9, 12, 15]:
        print(i)
    
    
    for i in range(3, 16, 3):
        print(i)
    
    for i in [3, 6, 9, 12, 15]:
        print(i)
    
    
    for i in range(3, 15, 3):
        print(i)
    
    for i in [3, 6, 9, 12]:
        print(i)
    
    -----------------------------
    ◆ range 함수 장점
    - 간편하고 깔끔함
    - 컴퓨터 메모리를 효율적으로 사용함.

     

    피타고라스 삼조

    for a in range(1, 400):
        for b in range(1, 400):
            c = 400 - a - b
            if a ** 2 + b ** 2 == c ** 2 and a < b < c:
                print(a * b * c)

     

    리스트 뒤집기

    numbers = [2, 3, 5, 7, 11, 13, 17, 19]
    
    # 리스트 뒤집기
    # 여기에 코드를 작성하세요
    
    print("뒤집어진 리스트: " + str(numbers))
    
    뒤집어진 리스트: [19, 17, 13, 11, 7, 5, 3, 2]
    numbers = [2, 3, 5, 7, 11, 13, 17, 19]
    
    # 리스트 뒤집기
    # numbers.reverse()
    
    for num in range(0, int(len(numbers)/2)):      # 반만 나눔 → 리스트 길이의 절반을 정수값으로 함
        temp = numbers[num]                        # temp라는 임시 교환변수 만들어서 넣어주기
        numbers[num] = numbers[len(numbers)-1-num] # 대칭되는 원소들 바꾸고, 가운데 건 내버려둠
        numbers[len(numbers)-1-num] = temp
    
    print("뒤집어진 리스트: " + str(numbers))
    
    # 주의점 : 대칭되는 원소 교환은 한번만 
    # (리스트 길이의 절반만 해야됨. 안 그럼 원상복귀)
    numbers = [2, 3, 5, 7, 11, 13, 17, 19]
    
    # 리스트 뒤집기
    for left in range(len(numbers) // 2):  # 나누기하고 나온 몫 (정수값)
        # 인덱스 left와 대칭인 인덱스 right 계산
        right = len(numbers) - left - 1
    
        # 위치 바꾸기
        temp = numbers[left]
        numbers[left] = numbers[right]
        numbers[right] = temp
    
    print("뒤집어진 리스트: " + str(numbers))

    뒤집을 원소를 left, right로 구분

    인덱스 구하는 것과 위치 바꾸는 것의 단계를 나누어 놓았음.


    3. 사전

    사전

    # 사전 (dictionary)
    # key-value pair (키-값 쌍)
    my_dictionary = {
        5: 25,
        2: 4,
        3: 9
    }
    print(type(my_dictionary))  # <class 'dict'>
    
    # 딕셔너리 값 받아오기
    print(my_dictionary[3])  # 9
    
    # 딕셔너리 값 추가
    my_dictionary[9] = 81
    print(my_dictionary)  # {5: 25, 2: 4, 3: 9, 9: 81}
    
    # 리스트 인덱스 : 정수형임
    # 사전 키 : 정수형일 필요가 없음
    
    my_family = {
        '엄마' : '김자옥',
        '아빠' : '이석진',
        '아들' : '이동민',
        '딸' : '이지영'
    }
    
    print(my_family['아빠'])  # 이석진

     

    사전 활용법

    my_family = {
        '엄마' : '김자옥',
        '아빠' : '이석진',
        '아들' : '이동민',
        '딸' : '이지영'
    }
    
    print(my_family.values())
    # dict_values(['김자옥', '이석진', '이동민', '이지영'])
    
    print('이지영' in my_family.values())
    # True
    
    print('성태호' in my_family.values())
    # False
    
    # for문으로 값 하나씩 출력
    for value in my_family.values():
        print(value)
    """
    김자옥
    이석진
    이동민
    이지영
    """
    
    print(my_family.keys())
    # dict_keys(['엄마', '아빠', '아들', '딸'])
    
    # for문으로 키 목록 출력
    for key in my_family.keys():
        print(key)
    """
    엄마
    아빠
    아들
    딸
    """
    
    # key와 value를 모두 출력
    for key in my_family.keys():
        value = my_family[key]
        print(key, value)
    """
    엄마 김자옥
    아빠 이석진
    아들 이동민
    딸 이지영
    """
    
    # key와 value를 모두 출력 (한 줄)
    for key, value in my_family.items():
        print(key, value)
    """
    엄마 김자옥
    아빠 이석진
    아들 이동민
    딸 이지영
    """

     

    투표 집계하기

    # 투표 결과 리스트
    votes = ['김영자', '강승기', '최만수', '김영자', '강승기', '강승기', '최만수', '김영자', \
    '최만수', '김영자', '최만수', '김영자', '김영자', '최만수', '최만수', '최만수', '강승기', \
    '강승기', '김영자', '김영자', '최만수', '김영자', '김영자', '강승기', '김영자']
    
    # 후보별 득표수 사전
    vote_counter = {}
    
    # 리스트 votes를 이용해서 사전 vote_counter를 정리하기
    # 후보 이름이 없으면 넣어주고, 있으면 1 추가
    for name in votes:
        if name in vote_counter:
            vote_counter[name] += 1
        else:
            vote_counter[name] = 1
    
    # 후보별 득표수 출력
    print(vote_counter)

    4. 파이썬 데이터의 비밀

    Aliasing

    Aliasing(에일리어싱) : 객체의 별칭(alias)
    한 객체에 대해 여러 개의 이름(변수)을 가지는 것.
    실제 데이터를 직접 포함하는 것이 아니라, 데이터가 저장된 메모리 위치를 참조하는 방식으로 동작함.
    하나의 데이터에 여러 개의 변수 이름을 할당하여 동일한 데이터에 접근할 수 있음.
    이 때, 하나의 변수 이름을 통해 해당 데이터를 변경하면 다른 모든 변수 이름으로도 동일한 변경 결과가 반영됨.

    original_list = [1, 2, 3]
    alias_list = original_list # original_list와 동일한 객체를 가리키는 alias_list 변수
    
    # original_list와 alias_list는 동일한 객체를 가리키기 때문에 하나를 수정하면 다른 하나도 영향을 받습니다.
    alias_list.append(4)
    
    print(original_list)
    # 출력결과 : [1, 2, 3, 4]

     

    리스트와 문자열

    """
    리스트
    """
    
    alphabet_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
    
    print(alphabet_list[0])  # A
    print(alphabet_list[1])  # B
    print(alphabet_list[4])  # E
    print(alphabet_list[-1])  # J
    
    
    """
    문자열
    """
    
    alphabet_string = 'ABCDEFGHIJ'
    
    print(alphabet_string[0])  # A
    print(alphabet_string[1])  # B
    print(alphabet_string[4])  # E
    print(alphabet_string[-1])  # J
    
    
    """
    리스트 슬라이싱
    """
    
    alphabet_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
    
    print(alphabet_list[0:5])
    # 0부터 4까지
    # ['A', 'B', 'C', 'D', 'E']
    
    print(alphabet_list[4:])
    # 4부터 끝까지
    # ['E', 'F', 'G', 'H', 'I', 'J']
    
    print(alphabet_list[:4])
    # 0부터 3까지
    # ['A', 'B', 'C', 'D']
    
    
    """
    문자열 슬라이싱
    """
    
    alphabet_string = 'ABCDEFGHIJ'
    
    print(alphabet_string[0:5])  # ABCDE
    print(alphabet_string[4:])   # EFGHIJ
    print(alphabet_string[:4])   # ABCD
    # 리스트와 문자열 연결
    
    str_1 = 'Hello'
    str_2 = 'World'
    str_3 = str_1 + str_2
    print(str_3)
    # HelloWorld
    
    list_1 = [1, 2, 3, 4]
    list_2 = [5, 6, 7, 8]
    list_3 = list_1 + list_2
    print(list_3)
    # [1, 2, 3, 4, 5, 6, 7, 8]
    
    
    # len 함수
    
    my_list = [2, 3, 5, 7, 11]
    print(len(my_list))  # 5 (5개)
    
    my_string = 'Hello world!'
    print(len(my_string))  # 12 (12개-띄어쓰기, 문장부호 포함)
    
    
    # 리스트와 문자열의 차이
    
    numbers = [1, 2, 3, 4]
    numbers[0] = 5
    print(numbers)  # [5, 2, 3, 4]
    
    """
    name = 'codeit'
    name[0] = 'C'
    print(name)
    
    오류가 나옴
    - 리스트는 수정해도 되지만 문자열은 수정할 수 없음.
    - 문자열 더하기는 가능함
    """

     

    자릿수 합 구하기

    # 자리수 합 리턴
    def sum_digit(num):
        sum = 0
        string = str(num)
        for digit in string:
            sum += int(digit)
        return sum
    
    # sum_digit(1)부터 sum_digit(1000)까지의 합 구하기
    answer = 0
    for i in range(1, 1001):
        answer += sum_digit(i)   
    
    print(answer)

    모범답안이랑 변수 이름빼고 거의 똑같음.

     

     

    팰린드롬

    def is_palindrome(word):
        for i in range(len(word) // 2):
            if word[i] != word[len(word)-1-i]:
                return False
        return True
                    
    # 테스트 코드
    print(is_palindrome("racecar"))

    서로 배타적인 조건에서 각각 다른 결과값이 나온다고 하면 return문 자체를 2개 이상 사용해도 상관없음.

    728x90