whatisthis?

Phython. 파이썬 코딩 기초편-04 본문

WEB STUDY/PHYTHON | BACK-END

Phython. 파이썬 코딩 기초편-04

thisisyjin 2021. 8. 31. 14:15

리스트 / 사전 / 튜플 / 세트 / 자료구조 변경

 

<Day 3 Quiz>

 

사이트별로 비밀번호를 만들어주는 프로그램.

 

예) http://naver.com

 

<규칙>

1. http://  부분은 제외 ->  naver.com

2. 처음만나는 점(.) 이후 부분은 제외 -> naver

3. 남은 글자중 처음 세자리 + 글자갯수 + 글자 내 'e'갯수 + "!"로 구성

                          (nav)       (5)             (1)                  (!)

예 > nav51!

 

(1:17:13)

 

site = "http://naver.com"


index = site.index("/")
index = site.index("/", index + 1)
print(index)

print(site[index + 1:])


index2 = site.index(".")
print(index2)
length = site[index + 1:index2]

print(length[:3] + str(len(length)) + str(length.count("e")) + "!")

 

문제가 뭔가 이상한듯.
굳이 앞 세글자만 할거면 http://제거만 하지 왜 .com 제거를 하라 했을까?

암튼 나는 site 변수가 달라졌을 경우를 생각하여 좀 복잡하게 (깔끔하지 않게) 작성했다.

 

_



1. http://가 아니고 https://인 경우도 있으므로
index = site.index("/")
index = site.index("/", index + 1) 를 하여 두번째 '/'를 찾고나서
print(site[index + 1:] 로 그 이후부터를 출력하였다.

2. daum.com인 경우에는 .의 위치가 다섯번째이고
naver.com인 경우는 여섯번째이다. 즉, 점의 위치를 찾기 위해서
index2를 설정 하고 print(site[index+1:index2]로 작성했다.

-> index2직전까지 이므로, '.'위치의 직전까지가 범위가 된다.

3. 위 과정을 중간의 확인차 적은 print를 제외하고 깔끔하게 적으면

index = site.index("/")
index = site.index("/", index + 1)
index2 = site.index(".")
length = site[index + 1:index2]

과 같다.

4. 여기까지 한 후에 비밀번호 조합을 하면 다음과 같다.
print(length[:3] + str(len(length)) + str(length.count("e")) + "!")

 

다음과 같이 site변수값을 다르게 했음에도 정상적으로 작동함을 알 수 있다.

 

 

 

url = "http://naver.com"
my_str = url.replace("http://", "")

my_str = my_str[:my_str.index(".")]

password = my_str[:3] + str(len(my_str)) + str(my_str.count("e")) + "!" 
print("{0}의 비밀번호는 {1}입니다.".format(url, password))

언급된 정답.

이는 url이 만약에 https://일때를 고려하지 않은 코드인 것 같다.

 

그러나 나같은 경우엔 index1과 index2 두개의 변수를 사용했는데,

굳이 그럴 필요 없고 my_str = my_str[:my_str.index(".")]와 같이 작성해도 좋을 것 같다.

 

site = "http://naver.com"


index = site.index("/")
index = site.index("/", index + 1)
length = site[index + 1:site.index(".")]

passwd = length[:3] + str(len(length)) + str(length.count("e")) + "!"
print("{0}의 비밀번호는 {1} 입니다.".format(site, passwd))

위에서 내가 작성한 코드를 수정해보았다.

변수의 개수도 줄어들었고, 훨씬 간편한 코드가 완성된 것 같다.

 

 

 


1. 리스트

# 리스트 []

# 지하철 칸별로 10명, 20명, 30명

# 원래대로라면 subway1 = 10
# subway2 = 20
# subway3 = 30

subway = [10, 20, 30]
print(subway)

subway = ["김씨", "이씨", "박씨"]

# 이씨가 몇번째 칸에 타고 있는지
print(subway.index("이씨"))

# 최씨가 다음 정류장에서 다음 칸에 탔을때
subway.append("최씨")
print(subway)

 

 

** 리스트의 맨 뒤에 요소 추가할때 = uppend() 함수

 

 

 

** 만약 김씨와 이씨 사이에 정씨를 추가하고 싶다면? = insert(인덱스,추가할것)

subway.insert(1, "정씨")
print(subway)

 

subway.insert(1, "정씨")

= 1번지(즉, 두번째)에 정씨를 추가한다.

 

 

 

 

** 한명씩 뒤에서부터 하나씩 꺼내기 =  pop() 함수

print(subway.pop())
print(subway)

 

연속 세번 실행해본 결과는 다음과 같다.

뒤에서부터 하나씩 꺼내므로 총 3개가 꺼내진 것과 같다.

 

 

 

** 같은 이름의 사람이 몇 명이 있는지 = count() 함수

#같은 이름의 사람이 몇 명 있는지 확인
subway.append("김씨")
print(subway)
print(subway.count("김씨"))

 

 

** 리스트 정렬도 가능. = sort() 함수

# 정렬도 가능 = sort() 함수

num_list = [5,2,4,3,1]
num_list.sort()
print(num_list)

 

 

** 순서 뒤집기도 가능 = reverse() 함수

# 정렬도 가능 = sort() 함수

num_list = [5,2,4,3,1]
num_list.sort()
print(num_list)


#뒤집기 = reverse()함수

num_list.reverse()
print(num_list)

 

 

 

** 리스트 속의 값 모두 지우기 =  clear() 함수

num_list.clear()
print(num_list)

결과 : [ ]  (안에 있던 요소들이 다 삭제됨.)

 

 

 

** 여러가지 자료형을 함께 리스트에 사용시

# 다양한 자료형 함께 사용시

mix_list = ["thisisyjin", 22, True]
print(mix_list)

문자열의 경우에는 ' '에 감싸져서 나온다

 

 

 

** 리스트의 확장 = extend(합칠리스트) 

 

num_list.extend(mix_list)

하나의 리스트로 합쳐진 것을 알 수 있다.

 

 

 

 


2. 사전

 

** 키는 중복이 안되고, 한개의 값만 열 수 있다. 

 

cabinet = {3 : "김씨", 100 : "최씨"}

3이라는 키는 김씨가 / 100이라는 키는 최씨가.

 

 

 

 

print(cabinet[3])  # 김씨 
print(cabinet[100])  # 최씨

print(cabinet.get(3)) # get()을 이용하여 불러올 수도 있음
print(cabinet.get(100))

< 출력 방법 > 

1. 변수명 [키값] = 대괄호 이용

2. 변수명.get (키값) = get() 함수 이용

 

변수명 [키값] 변수명.get (키값) 
존재하지 않는 키값을 적으면
오류가 발생한다.
존재하지 않는 키값을 적으면
None이라는 값을 반환한다.

 

+) 마치 지난번에 비교했던 index()와 find()의 차이와도 같다. = index는 오류 / find는 -1을 반환했었다.

 

 

 

print(cabinet.get(5, "사용가능")) #값이 없다면 '시용가능'이라는 메시지 반환

존재하지 않는 키값을 입력했을때 값이 없으면 None을 반환한다. (기본값)

만약, None 대신 다른 문구를 띄우고싶다면 get(키값, " 문구 ") 로 작성하면 된다. 

= 문구 대신 숫자나 논리식 작성해도 좋음.

 

 

 

 

** 해당 키값이 변수 안에 존재하는지 여부를 print를 통해 알 수 있음. = print(키값 in 변수명)

print(3 in cabinet) # 3이라는 키가 cabinet변수에 있는지 = True
print(5 in cabinet) # false

 

 

 

** 키값은 숫자 뿐만 아니라 String도 가능함 (대신 "" 로 감싸줘야함)

예> A-3

 

cabinet = {"A-3": "김씨", "B-100": "최씨"}

 

 

 

** 새로운 키와 value를 추가할 때는 변수명[키값] = value

 

cabinet["C-20"] = "이씨"

 

cabinet["C-20"] = "이씨"

C-20이라는 이름의 키값을 가진 / value는 '이씨'  를 추가한다.

 

+) 원래 있던 키값에 해당하는 value를 바꿀때에도 위와 같이 작성하면 된다.

 

 

예 > cabinet["A-3"] = "박씨"

원래 "A-3"값은 "김씨" 였으나 위 식을 통해 "박씨"로 수정할 수 있다.

 

 

 

** 키값과 value 삭제 = del cabinet[키값]

 

del cabinet["A-3"]
print(cabinet)

A-3키에 해당하는 값과 함께 세트로 사라지게 된다.

 

 

 

** Key값만 출력하려면 (value 말고)  = 변수명.keys()

** Value들만 출력하려면  = 변수명.values()

 

 

** (key,value) 와 같이 두 값을 쌍으로 묶어서 출력하려면 = 변수명.items()

 

 


** clear()함수 = 모든 값 삭제 (빈 중괄호만 남음)

 

 

 


 

3. 튜플

= 리스트나 사전과 같이 내용 변경할 수 없음. 그러나 속도가 빠름.

주로 변경되지 않는 값을 빠르게 제공하는데에 사용함.

 

 

menu = ("돈까스", "치즈까스")

print(menu[0])
print(menu[1])

 

튜플 변수 선언 :  (" ", " ")
출력 : 변수명[인덱스]

 

** 튜플은 값을 변경할 수 없다. 그렇다면 언제 사용할지> = 고정된 값. (절대 변하지 않는 값)

 

name = "yjin"
age = 22
hobby = "코딩"
print(name, age, hobby)

원래대로라면 총 3개의 변수를 각각 선언한 후, print(변수1, 변수2, 변수3)과 같이 출력했었다.

 

우리는 튜플을 이용해서 한꺼번에 선언하고 튜플채로 출력할 수 있다.

 

(name, age, hobby) = ("yjin", 22, "코딩")
print(name, age, hobby)

 


4. 세트 (set, 집합)

 

-중복 안됨. 순서 없음

 

세트 변수
선언
방법
변수명 = { 요소1, 요소2, 요소3 } { } 안에 나열.
변수명 = set( [요소1, 요소2, 요소3] ) [ ] 안에 적는 것은 리스트 이므로 , 리스트에 set()함수로 감싸준다.

 

 

set은 집합이므로 집합의 성질을 이용한 교집합, 합집합 등의 연산 가능.

 

 

 

1) 교집합 

# 교집합 (java, python 모두 할 줄 아는 사람)
print(java & python)
print(java.intersection(python))

두 방법 모두 가능하다.

1. & 연산자 이용 

- 단, java and python으로 하면 안된다. ☆ and가 아닌 &로 적어야함.

 

2. 변수1.intersection(변수2)

intersection() 함수를 이용한다.

 

 

2) 합집합 

# 합집합 (java 또는 python을 할 줄 아는 사람)
print(java | python)
print(java.union(python))

합집한 또한 두가지 방법이 존재한다.

1. | 연산자 이용

-단, or을 작성하면 안된다. 반드시 |로 작성해야함.

 

2. 변수1.union(변수2)

union() 함수를 이용한다.

 

** 집합은 순서가 없어서 순서대로 안나온다.

 

 

3) 차집합

# 차집합 (java는 할 줄 아는데 python을 못하는 사람)
print(java - python)
print(java.difference(python))

 

차집합도 두가지 방법이 존재.

1. - 연산자 이용

 

2. 변수1.difference(변수2)

difference() 함수를 이용한다.

 

 

4) 집합에 원소 추가/삭제 = add() / remove() 함수

 

 

# 집합에 원소 추가
python.add("pr2")
print(python)

# 집합에 원소 제거
java.remove("pr3")
print(java)

 

 

 

 


5. 자료구조의 변형

 

# 자료구조의 변경

menu = {"커피", "우유", "주스"}
print(menu, type(menu))

menu = list(menu)
print(menu, type(menu))

menu = tuple(menu)
print(menu, type(menu))

 

type()함수는 해당 변수의 자료구조를 출력해준다.

예 -> 튜플이면 <class 'tuple'>

 

 

<선언 방법 총정리>

리스트는 [ , ,  ]

사전은 { 키값1: value , 키값2: value}
튜플은 ( , , )
세트는 { , , } 또는 set([ , , ])

 

{ } 는 세트(집합) 이고, [ ] 는 리스트이고 , ( ) 는 튜플이다.

 

 

 


<Quiz>

당신의 학교에서는 파이썬 코딩 대회를 주최한다.

댓글 이벤트를 진행하기로 했는데, 댓글 작성자중에서 1명은 치킨, 3명은 커피 쿠폰을 받게 된다.

추첨 프로그램을 작성하시오.

 

조건1) 편의상 댓글은 20명이 작성했고, 아이디는 1~20 이라 가정

조건2) 댓글 내용과 관련 없이 무작위로 추첨. 중복은 불가

조건3) random 모듈의 shuffle과 sample을 이용

 

<random 모듈의 함수>

shuffle(변수명) = 순서 랜덤으로 섞어주는 함수
sample(변수명, 갯수) = 갯수만큼 랜덤으로 뽑는 함수

(1:51:04)

 

 

+)

from random import *
lst = [1,2,3,4,5]

shuffle(lst)
print(lst)

print(sample(lst, 1))

shuffle()과 sample()의 예제