Date : 2023-07-03
Topic : 연산자, 리스트, 튜플, 딕셔너리
Note
map을 사용할 정수로 변화하기
split 결과로 int로 매번 변환해주어야 하나?
한꺼번에 정수로 변환하기 위해서는 map을 함께 사용
map에 int와 input().split()을 넣으면 split의 결과를 한꺼번에 변환
- 5개의 숫자를 입력 받아 더하기(map과 split 사용)
#map을 사용하여 정수로 변환하기
i1,i2,i3,i4,i5=map(int,input("5개의 값입력: ").split())
print("합은 ", i1+i2+i3+i4+i5)
#output:
- 국어,영어,수학,과학 점수 입력하여 점수 평균 구하기
#평균 점수를 출력하는 프로그램(input에서 안내 문자열 출력)
#단 평균 점수 출력은 실수로 출력
국어,영어,수학,과학=map(int,input("과목 점수 입력: ").split())
print("과목 평균: ", ((국어+영어+수학+과학)/4))
#output:
더보기
과목 점수 입력: 10 20 30 40
25.0
가독성 좋게 다시 짜기
kor,eng,mat,sci=map(int,input("과목 점수 입력: ").split())
total=kor+eng+mat+sci
avg=total/4
print(avg)
#(값이 실수로 출력되므로 정수형으로 변환하려면 avg에 int() 사용)
나누기(/)는 자동으로 실수(float)로 출력된다!
sep(로 값 사이에 문자 넣기)
: sep = separator
- print(값1, 값2, sep='문자 또는 문자열')
- print(변수1, 변수2, sep='문자 또는 문자열')
- 콤마(,), 슬래쉬(/), 공백( ), 기호(+,-), 문자열(x) 등
print(1,2,3,sep=', ')
print('hello','python', sep=' ')
#output:
줄 바꾸기(개행)
역슬래쉬(\)
\n
< 실습 >
kor,eng,mat,sci=map(int,input("과목 점수 입력: ").split())
total=kor+eng+mat+sci
print(kor,eng,mat,sci, sep='+')
print('총합은',total,'입니다')
#output:
더보기
과목 점수 입력: 85 90 80 95
85+90+80+95
총합은 350 입니다
print 줄 바꾸기 금지
- print(값, end='문자 또는 문자열')
- print(변수, end='문자 또는 문자열')
*기본적으로 print의 end에 '\n'이 지정된 상태인데 빈 문자열을 지정하면 강제로 '\n'을 지워주기 때문
print('a', end='')
print('b', end='')
print('c')
print(1, end='')
print(2, end='')
print(3)
#output:
< 실습 >
year=2019
month=1
day=31
hour=10
minute=33
second=57
print(year,month,day, sep='/')
print(hour,minute,second, sep=':')
#output:
year=2019
month=1
day=31
hour=10
minute=33
second=57
print(year,month,day, sep='/', end=' ')
print(hour,minute,second, sep=':')
#output:
연산자
- 참/거짓(Boolean, 불연산자)
: 값의 일종으로 참(True), 거짓(False) 표현
print(3>1) #True
print(3<1) #False
10==10 #True
10!=5 #True
'Python'=='python' #True
'Python'!='python' #True
10 >= 10 #True
- 논리 연산자
- and : 모두 참일 때
- or : 둘중 하나가 거짓
- not : 반대로 변환
(10==10) and (10!=5) #True and True
(10>5) or (10<3) #True or False
not(10>5) #not True
not(1 is 1.0) #not False
- 연산자가 복합적으로 쓰였을 때
: ①비교 연산자(is, is not, ==, !=, <, >, 등)를 먼저 판단하고 ②논리 연산자(and, or, not)를 판단
- 비교 연산자 + 논리 연산자
type |
분류 |
논리 값 |
숫자 |
정수0 / 실수 0.0 |
False |
이외의 모든 숫자 |
True |
문자 |
' ' 또는 " " |
False |
이외의 모든 문자 |
True |
bool(1) #True
bool(0) #False
bool(1.5) #True
bool('False') #True
bool('') #False
bool(' ') #True
< 실습 >
: 국 영 수 과/ 한 과목이라도 50점 미만이면 불합격
합격이면 True, 불합격이면 False로 출력
kor=92
eng=47
math=86
sci=81
print(kor>=50 and eng>=50 and math>=50 and sci >= 50) #output: False
모두 50점 이상이어야 합격(True)인데 영어 한 과목이 과락이므로 불합격 처리가 된다. 따라서 연산자 >=, and를 사용해주면 출력값을 알 수 있다.
< 실습 >
표준 입력으로 국/영/수/과 점수 입력. 국어는 90점 이상, 영어는 80점 초과, 수학은 85점 초과, 과학은 80점 이상일 때 합격이라고 하면(한 과목이라도 조건에 만족하지 않으면 불합격), 다음 소스 코드를 완성하여 합격이면 True, 불합격이면 False가 출력되게 만들기(input에서 안내 문자열은 출력X)
kor, eng, math, sci=map(int, input().split())
print(kor>=90 and eng>80 and math>85 and sci>=80)
또는
kor, eng, math, sci=map(int, input().split())
PASS = kor>=90 and eng>80 and math>85 and sci>=80
print(PASS)
#pass는 파이썬 문법에서 사용되는 단어라서 PASS(소문자->대문자)로 할당
문자열
작은 따옴표(' ')와 큰 따옴표(" ") 구분 必
single quote = ' ' ' "안녕하세요."
'파이썬'입니다. ' ' '
double quote1 = """"Hello"
'Python' """
double quote2 = """"Hello",'python' """ #한 줄로 작성
single_quote = '''"안녕하세요."
'파이썬'입니다.'''
double_quote1 = """"Hello"
'Python' """
double_quote2 = """"Hello", 'python' """ #한 줄로 작성
print(single_quote)
print(double_quote1)
print(double_quote2)
#output:
더보기
"안녕하세요."
'파이썬'입니다.
"Hello"
'Python'
"Hello", 'python'
리스트(list)
: data를 관리하기 편리하도록 묶어서 순서를 정하고 사용하는 data type
- 변수에 값을 저장할 때 [ ] (대괄호)로 묶어줌. 각 값은 ,(콤마)로 구분
- 리스트에 저장된 각 값 → 요소(element)
리스트 = [값1, 값2, 값3]
a=[38,21,53,62,19]
a
#out: [38, 21, 53, 62, 19]
- 리스트는 문자열, 정수, 실수, 불 등 모든 자료형을 저장할 수 있으며 자료형을 섞어서 저장해도 됨
person=['David', 49, 173.3, True]
person
#out: ['David', 49, 173.3, True]
a=[]
a
b=list()
b
#out: []
range : 연속된 숫자를 생성. range에 10을 지정하면 0~9 생성함.
즉, 지정한 숫자는 생성되는 숫자에 포함X, (default=0, 생략하면 0부터 생성)
리스트 = list(range(시작, 끝))
a=list(range(10))
print(a)
#out: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a=list(range(3,12))
print(a)
#out: [3, 4, 5, 6, 7, 8, 9, 10, 11]
리스트 = list(range(시작, 끝, 증가폭))
a=list(range(-4,20, 2))
print(a)
#out: [-4, -2, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
a=list(range(10, 0, -1))
print(a)
#out: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
튜플(tuple)
: 리스트처럼 요소를 일렬로 저장하지만, 안에 저장된 요소를 변경, 추가, 삭제가 불가능 (읽기 전용 리스트)
- 변수에 값을 저장할 때 ( ) (괄호)로 묶어주면 튜플이 되며, 값은 ,(콤마)로 구분. 또는 괄호로 묶지 않고 값만 콤마로 구분해도 튜플이 됨
a=(38,21,53,62,19)
print(a)
#out: (38, 21, 53, 62, 19)
b=38,21,53,62,19
print(b)
#out: (38, 21, 53, 62, 19)
- 저장된 요소를 변경, 추가, 삭제할 수도 없는 튜플을 만들어 놓은 이유
- 파이썬 프로그래밍에서 튜플 사용이 더 유리한 경우도 있음.
- 보통 요소가 절대 변경되지 않고 유지되어야 할 경우
- 요소를 실수로 변경하는 상황 방지 (튜플은 변경 시 에러 발생)
- 요소가 한 개인 튜플을 만들 때는 ( ) 안에 값 한 개를 넣고, ,(콤마)를 사용
a=(38, )
print(a)
#out: (38,)
b=(4,5,6)
list(b)
#out: [4, 5, 6]
#리스트를 생설할 때는 대괄호 [ ]
a=[1,2,3]
tuple(a)
#out: (1, 2, 3)
#튜플을 생설할 때는 괄호 ( )
list('Hello')
#out: ['H', 'e', 'l', 'l', 'o']
tuple('Hello')
#out: ('H', 'e', 'l', 'l', 'o')
- list, tuple로 변수 만들기
: 변수의 개수와 리스트(튜플)의 요소 개수가 같아야 함
a,b,c=[1,2,3]
print(a,b,c)
#out: 1 2 3
x=[1,2,3]
a,b,c=x
print(a,b,c)
#out: 1 2 3
y=(4,5,6)
d,e,f=y
print(d,e,f)
#out: 4 5 6
- 입력 값을 변수 두 개에 저장하기 위해 사용한 input().split()은 리스트를 반환. 따라서 리스트 언패킹 형식으로 입력값을 변수 여러 개에 저장할 수 있음
x=input().split()
print(x)
a,b=x
print(a,b)
print(a+b)
#output:
< 실습 >
a=list(range(5, -10, -2))
print(a)
#output:
더보기
[5, 3, 1, -1, -3, -5, -7, -9]
시퀀스 자료형 활용
- 시퀀스 자료형 4가지
- 리스트
- 튜플
- range
- 문자열
- 공통점: 연속적
- 특징: 공통 동작과 기능
- 시퀀스 객체: 시퀀스 자료형으로 만든 객체
- 요소(element): 시퀀스 객체에 들어있는 각 값
- 특정 값이 있는지 확인하기
- 시퀀스 객체에 (not) in 연산자
- 튜플, range, 문자열도 같은 방법으로 사용 가능
a=[0,10,20,30,40,50,60,70,80,90]
30 in a #output: True
100 in a #op: False
43 not in (38,76,43,62,19) #op: False
1 not in range(10) #op: False
'P' not in 'Hello, Python' #op: False
< 실습 >
0~20 사이 홀수 값을 요소로 가지는 리스트를 만들고 표준 입력 값을 받아들여서 그 값이 리스트에 없는지 확인
a=list(range(1, 20, 2))
inData=input('정수 값을 입력:')
print(int(inData) not in a)
#output:
< 실습 >
['사과', '배', '귤', '오렌지']와 ['토마토', '바나나', '수박', '딸기'] 두 개의 list 중 '사과'가 있는 지 확인
1) 연결하기로 작성
2) 연결하지 않고 논리 연산자로 작성해서 결과 확인
a=['사과','배','귤','오렌지']
b=['토마토','바나나','수박','딸기']
fruit=a+b
print('사과' in fruit)
print(('사과' in a) or ('사과 in b'))
#op: True
※ 시퀀스 자료형 중 range는 + 연산자로 객체를 연결할 수 없음 (마찬가지로 * 연산자 불가능.)
→ 사용하려면 unpacking 해야함
len( ) (=length)
a=[0,10,20,30,40,50,60,70,80,90]
len(a)
#output: 10
- 문자열의 길이도 구할 수 있다
- 인덱스
- 각 요소는 순서가 정해져 있음
- 시퀀스 객체에 [ ]를 붙이고 [ ] 안에 각 요소의 인덱스를 지정하면 해당 요소에 접근 가능
- 대부분 프로그래밍 언어는 인덱스가 0부터 시작
a=[38,21,53,62,19]
print(a[0])
print(a[2])
print(a[4])
#output:
38
53
19
- 1~20까지 정수 중 홀수를 요소로 가지는 리스트를 만들고, 이중 세 번째 홀수를 찾아내어 그 값을 표시하는 표시
a=list(range(1, 20, 2))
print(a[2])
#output: 5
#a=[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
- 1~100 정수 중 짝수 리스트, 마지막 세 번째 짝수를 찾아내어 표시
a=list(range(2, 101, 2))
print(a[-3])
#output: 96
#인덱스를 음수로 설정해 마지막 숫자부터 3번째를 출력
- 시퀀스 객체는 [ ]로 요소에 접근한 뒤 =로 값을 할당
시퀀스 객체[인덱스] = 값
a=[0,0,0]
a[0]=38
a[1]=52
a[2]=46
#op: [38,52,46]
del 시퀀스객체[인덱스]
a=[38,21,53,62,19]
del a[2]
a
#op: [38,21,62,19]
- 시퀀스 슬라이스: 시퀀스 객체의 일부를 잘라서 새 리스트로 만듦
- 실제로 가져오는 요소는 시작 인덱스부터 끝 인덱스-1까지임
ex) a[0:5] -> 0부터 4까지!
- 중간부터 가져올 수 있음.
ex) a[4:9] -> 4부터 8까지!
시퀀스객체[시작 인덱스:끝 인덱스]
a=[38,21,53,62,19]
a[0:3] #인덱스 0부터 2까지 잘라서 새 리스트로 작성
#output: [38,21,53]
- 인덱스 증가폭 사용하기
- 슬라이스는 증가폭을 지정하여 범위 내 인덱스를 건너뛰며 요소를 가져올 수 있음
a=[-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10]
print(a[10:21:2])
print(a[13:20:2])
print(a[2:19:2])
print(a[5:16:5])
#양수가 뒤쪽에 있으니 인덱스를 음수로 접근해도 됨
#output:
더보기
[0, 2, 4, 6, 8, 10]
[3, 5, 7, 9]
[-8, -6, -4, -2, 0, 2, 4, 6, 8]
[-5, 0, 5]
- 슬라이스에 요소 할당하기 : 시퀀스 객체는 슬라이스로 범위를 지정하여 여러 요소에 값을 할당할 수 있음
- 범위를 지정해서 요소를 할당했을 경우, 원래 있던 리스트가 변경되며 새 리스트는 생성되지 않음.
시퀀스객체[시작 인덱스:끝 인덱스] = 시퀀스객체
a=[0,10,20,30,40,50,60,70,80,90]
a[2:5]=['a','b','c'] #인덱스 2부터 4까지
print(a)
#output: [0, 10, 'a', 'b', 'c', 50, 60, 70, 80, 90]
- a[2:5] = ['a', 'b', 'c']는 슬라이스 범위와 할당 리스트 요소 개수를 정확히 맞추었지만 사실 개수를 맞추지 않아도 상관없음.
- 요소 개수를 맞추지 않아도 알아서 할당됨
- 할당할 요소 개수가 적으면 그만큼 리스트의 요소 개수도 줄어듦⭐
a=[0,10,20,30,40,50,60,70,80,90]
a[2:5]=['a'] #인덱스 2부터 4까지 값 1개 할당
print(a)
#output: [0, 10, 'a', 50, 60, 70, 80, 90]
< 실습 >
- 최근 3년 결과 출력 (hint: '최근 3년' - 마지막 요소부터 3개를 출력하면 된다는 뜻)
year = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018]
population = [10249679, 10195318, 10143645, 10103233, 10022181, 9930616, 9857426, 9838892]
print(year[-3::])
print(population[-3::])
# or
print(year[5:8])
print(population[5:8])
# or
print(year[5:])
print(population[5:])
#output:
[2016, 2017, 2018]
[9930616, 9857426, 9838892]
#세 개 모두 같은 출력값
- 표준 입력으로 숫자 또는 문자열 여러 개가 입력되어 리스트 x에 저장
마지막 요소 5개를 삭제한 뒤 튜플로 출력
x=input().split()
del x[-5:]
print(tuple(x))
- 표준 입력으로 문자열 두 개가 각 줄에 입력
첫 번째 문자열에서 인덱스가 홀수인 문자와 두 번째 문자열에서 인덱스가 짝수인 문자를 연결하여 출력
- input에서 안내 문자열 출력 안해도 됨
- 연결 순서는 첫 번째 문자열, 두 번째 문자열 순
- 0은 짝수 처리
x=input()
y=input()
print(x[1::2])
print(y[::2])
z=x[1::2]+y[::2] #z=x[1:len(x):2]+y[0:len(y):2]
print(z)
12345
abcde
24
ace
24ace
딕셔너리 사용하기
- 값마다 이름을 붙여서 저장하는 방식
- 사전이라는 뜻과 같이 단어 찾듯 값을 가져올 수 있음
fruit={'apple':1000, 'banana':700, 'orange':1500, 'pineapple':2000}
print(fruit)
#output: {'apple': 1000, 'banana': 700, 'orange': 1500, 'pineapple': 2000}
x = { 키 : 값 }
- 딕셔너리를 만들 때 키 이름이 중복되면 가장 뒤에 있는 값만 적용됨
- 키는 문자열뿐만 아니라 정수, 실수, 불도 사용 가능(섞어서 가능)
- 빈 딕셔너리 (빈 리스트랑 동일!)
lux=dict(zip(['health', 'mana', 'melee', 'armor'], [490,334,550,18.72]))
print(lux)
#output: {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
- 원하는 과일(키)을 입력하면 이름과 가격이 출력되는 프로그램
fruit={'apple':1000, 'banana':700, 'orange':1500, 'pineapple':2000}
sel=input("과일 이름을 입력하세요: ")
print("선택한",sel,"의 가격은",fruit[sel],"원입니다")
#output:
더보기
과일 이름을 입력하세요: apple
선택한 apple 의 가격은 1000 원입니다
soon