리스트 (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 리스트를 가리키는 형태
리스트 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) 쌍으로 저장된다.
키로 검색할 수 있다.
키:값으로 구성되며 키는 중복이 불가능하지만, 값은 중복이 가능하다.
항목 탐색에는 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("정확한 전화번호 양식입니다.")
'파이썬 & 머신러닝과 딥러닝' 카테고리의 다른 글
6일차 - 다양한 Numpy 관련 기초 내용 및 Numpy를 활용한 기상데이터 분석 학습 (1) | 2024.01.11 |
---|---|
5일차 - MySQL, pymysql, tkinter와 pymysql 연동, 기상청 데이터 분석, 인구 현황 분석 (1) | 2024.01.10 |
4일차 - 파일과 예외처리, 내장함수, 람다식, 모듈, Top-K 텍스트 분석, CF기반 추천 시스템 (1) | 2024.01.09 |
3일차 - 객체와 클래스, 상속, tkinter를 이용한 GUI 프로그래밍 (2) | 2024.01.08 |
1일차 파이썬 - 입력과 출력, 변수와 수식, 조건문, 반복문, 함수 (2) | 2024.01.04 |