본문 바로가기

파이썬 & 머신러닝과 딥러닝

2일차 파이썬 - 리스트, 튜플, 집합, 사전, 문자열

리스트 (List)

index(인덱싱)은 특정항목 하나를 가리키는 것

 

참조할 때는

for element in A:
    element = element + 1
print(A)

for 문을 통해서는 리스트를 바꿀 수 없다.

 

 

수정할 때는

for x in range(len(A)):
    A[x] += 1
print(A)


 

append()

: 공백 리스트를 생성하여 리스트에 항목을 추가한다.

 

insert()

: 리스트 특정 위치에 항목 추가 (A.insert(1, 'x'))

 

insert()는 밀어줘야하는 시간이 있어 append()가 더 빠르다

 

리스트 탐색하기

: A.index("3")

 

요소 삭제하기

  • 저장된 위치를 알고 있다면 pop(i)
  • 항목의 값만 알고 있다면 remove(value)

sort()는 리스트 자체가 변경 sorted()는 오름차순으로 정렬 후 새로운 리스트를 리턴

 

 

2번째로 큰 값을 삭제하는 방법

# 1번째 방법
A.sort()
A[-2]

# 2번째 방법
A.remove(max(A))
max(A)

 

리스트 합치는건 + 더하기, 리스트 반복은 * 곱하기


슬라이싱

: 리스트[ start : stop ] -> 새로운 리스트가 생성된다.

 

# 리스트 슬라이싱 만을 이용하여 리스트의 요소들의 순서를 거꾸로 하면서 하나씩 건너뛰기
numbers = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
numbers[::-2]

list[::-1] -> 리스트 역순으로


# 리스트 슬라이싱 만을 이용하여 첫 번째 요소만을 남기고 전부 삭제
numbers = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
numbers[1:] = []
numbers

 


# 5명의 성적을 차례대로 입력받아 리스트에 저장한 후, 아래 내용을 수행
# 성적을 오름차순으로 정렬하여 출력
# 최고 성적과 최저 성적 출력
# 성적의 합과 평균 출력
# 성적이 90점 이상인 학생의 수를 출력
A=[]
for _ in range(5):
    grade = int(input("성적을 입력하세요: "))
    A.append(grade)
# 성적을 오름차순으로 정렬하여 출력
print(sorted(A))

# 최고 성적과 최저 성적 출력
print(f"최고성적: {max(A)}, 최저성적: {min(A)}")

# 성적의 합과 평균 출력
print(f"성적의 합: {sum(A)}, 평균: {sum(A)/len(A)}")

# 성적이 90점 이상인 학생의 수를 출력
count = 0
for x in A:
    if x >= 90:
        count += 1
print("성적이 90점 이상인 학생의 수: ", count )

 


# 정수를 저장한 배열, arr에서 가장 작은 수를 제거한 배열을 반환하는 함수를 완성하라
# 단, 반환하려는 배열이 빈 배열인 경우는 -1을 채워 반환

def remove_min(A):
    B = A.copy()
    B.remove(min(B))
    if B == []:
        return [-1]
    else:
        return B

 


# 1부터 45 사이 중복되지 않은 정수 5개를 무작위로 생성하여 정렬하여 출력
import random
lotto = []

while len(lotto) < 6:
    num = random.randint(1, 45)
    if num not in lotto:
        lotto.append(num)
print(sorted(lotto))

 


# 리스트 함축
# 0~99 까지의 정수 중에서 2의 배수이고 동시에 3의 배수인 수들을 모아서 리스트로
numbers = [x for x in range(100) if x%2 == 0 and x%3 ==0]
print(numbers)

 

 


 

파이썬의 2차원 리스트

 

모두가 따로따로 저장되어 있다. 리스트의 리스트로 구현된다.

1차원의 리스트가 있고 각각의 인덱스가 다시 하나의 row 리스트를 가리키는 형태

 

이 경우 2차원 리스트가 아님
id가 같은 모습을 볼 수 있음
동적으로 2차원 리스트를 생성한 모습
리스트 함축을 이용해 2차원 리스트 생성

 


리스트 vs 튜플

리스트 []

리스트의 경우 값을 추가해도 아이디가 같다.

 

 

튜플 (Tuple)

: 리스트와 유사하지만 변경 불가능

값이 하나인 경우 single_tuple = ("apple",) # 쉼표가 끝에 있어야 한다.

튜플의 경우 변경이 불가능 해서 값을 추가하면 아이디가 달라진다.

 

enumerate는 인덱싱 해준후 튜플로 제작 -> (index, value)

사전에서는 튜플만 사용 (키는 수정 안돼서 리스트로 만들기 불가능)

 


# 문장을 입력 받은 다음, split()를 수행하고 그 결과를 words 튜플에 저장
# 문장의 단어수 출력
# 세번째로 입력된 단어 출력
# 단어들을 정렬하여 출력

myList = input("문장을 입력하세요 : ").split() #split 사용시 공백 기준으로 잘라짐
myTuple = tuple(myList)
print(myTuple)
print("문장의 단어 수 : ", len(myTuple))
print("세번째로 입력된 단어 수 : ", myTuple[2]) #0부터 시작
print("정렬된 문장 : ", sorted(myTuple))

 


# 튜플의 함축
# 10일 동안 매출 기록을 rand.randint로 구하고 전날보다 매출이 떨어진 날이 언제인지 구하기

import random
T = tuple((random.randint(100, 150) for x in range(10)))
count = 0
for x in range(1, len(T)):
    if T[x] < T[x-1]:
        count += 1
print(T)
print(count)

 


# random.sample()을 이용하여 0부터 9 사이의 서로 다른 정수 8개로 구성된 튜플을 생성
# 이 튜플에 slicing 연산을 이용하기
T = tuple(random.sample(range(1,10), 8))
print(T)
for x in range(1, len(T)):
    print(T[:len(T)-x])


집합 (Set) 

집합(Set)은 sequence가 아니다. 집합(Set)은 고유한 값을 저장하는 자료구조

위치별로 엑세스 못해 인덱싱 슬라이싱이 불가능하지만 대신 변경은 가능

 

리스트에서 중복을 제거하고 싶을때 집합(Set)으로 만들고 리스트와 비교

교집합(intersection), 합집합(union) 사용에 유리

 

리스트에서 중복을 집합으로 만들어 제거하는 모습

 

 

 


# 사용자로부터 2개의 문자열을 받아서 두 문자열의 공통 문자를 출력
A = input("첫 번째 문자열 : ")
B = input("두 번째 문자열 : ")

C = set(A) & set(B) # 교집합

print("공통인 글자 : ", end=" ")
for i in C:
    print(i, end=" ")

&가 교집합

 


# 중복되지 않은 단어 수 세기
A = input("입력 테스트 : ").split() #split() 으로 공백을 기준으로 글자 가져오기
B = set(A) # set()으로 중복 제거
print("사용된 단어의 개수 = ", len(B))
print(B)

 


# 집합 S, T에 각각 1부터 20 사이의 난수를 10개 추가
# 집합 S와 T의 내요 출력
# 두 집합의 교집합, 합집합, 차집합 출력

import random
S = set(random.sample(range(1,20), 10))
T = set(random.sample(range(1,20), 10))

print(S)
print(T)

print("교집합: ", S & T)
print("합집합: ", S | T)
print("차집합: ", S - T)

 

 


# 중복된 데이터가 있는 정수 리스트를 입력받아, 중복을 제거하되 데이터 순서는 유지한 리스트를 반환하는 함수
def remove_duplicate(A):
    S = set(A)
    result = []
    for x in A:
        if x in S:
            result.append(x)
            S.remove(x)
    return result

 

 


 

딕셔너리(Dictionary, 사전)

: 키(key) - 값(value) 쌍으로 저장된다.

키로 검색할 수 있다.

키:값으로 구성되며 키는 중복이 불가능하지만, 값은 중복이 가능하다.

 

key로 value를 찾는 모습

 

항목 탐색에는 get 사용

항목 삭제에는 pop 사용

 


# 학생 5명의 이름과 성적을 입력 받아 사전에 저장한 후, 사전 출력
# 학생의 이름을 입력받아, 그 학생의 성적 출력
# 만약 사전에 없는 경우 "등록되지 않은 학생입니다." 출력
# 평균 성적, 성적이 가장 높은 학생의 이름, 90점 이상인 학생의 수 출력

D = {}
for _ in range(5):
    name, grade = input("학생의 이름과 성적을 입력하세요: ").split()
    D[name] = int(grade)
print(D)

name = input("학생 이름? ")
print(D.get(name, " 없는 학생입니다."))

print("평균 성적 : ", sum(D.values())/len(D))

maxGrade = max(D.values())
if grade == maxGrade:
    print("성적이 가장 높은 학생 이름 : ", name)

count = 0
for grade in D.values():
    if grade >= 90:
        count += 1
print("90점 이상인 학생의 수 : ", count)

 


# 사용자의 id와 비밀번호를 생성하여 저장
# id는 A부터 Z까지의 문자, 비밀번호는 1000부터 9999 사이의 난수를 생성하여 저장
# 이후 사용자에게 id를 입력 받으면 비밀번호를 알려주는 프로그램

ids = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
D = {}
for uid in ids:
    D[uid] = random.randint(1000, 9999)
print(D)

 


# 문장을 입력받은 다음, 각 문자에 대해 발생 빈도수를 dictionary에 저장하고 이를 출력
# 발생 빈도수가 가장 많은 문자와 빈도수를 출력

F = {}
msg = input("문장을 입력하세요 : ")
for ch in msg:
    F[ch] = F.get(ch, 0) + 1
print("빈도수 : ", F)

maxVal = max(F.values())
for key, val in F.items():
    if val == maxVal:
        print("빈도수 가장 많은 문자 : ", key)

 

 


 

문자열 (String)

 

문자열도 크게 보면 시퀀스(sequence)

문자열은 불변 객체

 

  • strip() : 문자열 앞과 뒤에 있는 공백 제거
  • '-'.join('010', '123', '234') : -를 중간에 넣어 리스트에 포함된 문자열을 결합
  • '010-123-234'.split('-') : - 구분자로 문자열 분할
  • isalpha() : 문자열이 알파벳(영어, 한글 등)으로 구성되어 있는지 확인
  • isdigit() : 문자열이 수로만 이루어졌는지 확인
  • isalnum() : 문자열이 알파벳과 수로만 이루어졌는지 확인

 


# 사용자로부터 평문을 입력받아 암호화하고 다시 복호화

import random

# 알파벳 문자열을 사용하여 키를 생성
key = list("abcdefghijklmnopqrstuvwxyz")

# 키를 복사하여 값으로 사용할 리스트를 생성
value = key[:]
random.shuffle(value)

# 딕셔너리 E를 생성
E = dict(zip(key, value))
print("치환 테이블:", E)

# 사용자로부터 평문을 입력받기
plain = input("평문을 입력하세요: ")

# 각 문자를 해당하는 치환된 값으로 대체하여 암호문을 생성
encrypted = ""
for ch in plain:
    if ch in E:
        encrypted += E[ch]
    else:
        encrypted += ch
print("암호문:", encrypted)

# 딕셔너리 E를 사용하여 복호화를 위한 치환 테이블 D를 생성합니다.
D = {v: k for k, v in E.items()}

# 암호문을 해독하여 평문을 생성합니다.
msg = ""
for ch in encrypted:
    if ch in D:
        msg += D[ch]
    else:
        msg += ch
print("해독된 메시지:", msg)


 

# 문자열을 입력받아, 한 글자씩 회전시켜 모두 출력하는 프로그램

msg = input("문자열을 입력하세요 : ")
for i in range (len(msg)):
    print(msg[i+1:] + msg[:i+1])

 


# 전화번호를 입력 받아, 전화번호 뒷 4자리를 제외한 나머지 숫자를 전부 *로 가리기

phone = input("전화번호를 입력하세요 : ")
print('*' * (len(phone)-4) + phone[-4:])

 


# 휴대폰 번호를 입력받는데, 입력 문자열이 '010-dddd-dddd' 형식이 아닌 경우 오류 출력 

while True:
    phone = input("휴대폰 번호를 입력하세요(종료는 q)")
    if phone == 'q':
        break
    if len(phone) != 13 or phone[:3] != '010':
        print("잘못된 전화번호 양식입니다.")
        continue
    A = phone.split('-')
    if len(A) != 3 or len(A[1]) != 4 or not A[1].isdigit() or not A[2].isdigit():
        print("잘못된 전화번호 양식입니다.")
        continue
    print("정확한 전화번호 양식입니다.")