# 0부터 9까지의 수를 포함하는 리스트array = [i for i in range(10)]
# range라는 함수는 0부터 9까지 i가 순회 할 수 있도록 해줌# i라는 변수가 0부터 9까지 증가를 할 때마다, 그 i 값을 원소로 설정해서 리스트를 만듬print(array)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
이렇게 유용한 게 있었다니…
# 0 부터 19까지의 수 중에서 홀수만 포함하는 리스트array = [i for i in range(20) if i & 2 == 1]
#0 부터 19까지 홀수만 출력 됨print(array)
# 1부터 9까지의 수들의 제곱 값을 포함하는 리스트array = [i * i for i in range(1,10)]
# i라는 변수는 1부터 9까지 증가하며 i 값들을 제곱해서 새로운 리스트를 만듬
또한, 리스트 컴프리헨션은 2차원 리스트를 초기화 할 때 효과적으로 사용이 가능
특히 N X M 크기의 2차원 리스트를 한 번에 초기화 해야 할 때 매우 유용함.
좋은 예시 : array = [[0] * m for _ in range(10)] → 반복 될 때 마다, m (열) 크기 만큼 리스트의 원소를 설정
n 번 반복을 할 때마다, 배열(가로) 길이가 m인 리스트(내용물이 0)를 생성함
언더바는 언제 사용 하는가?
파이썬에서는 반복을 수행하되, 반복을 위한 변수의 값을 무시하고자 할때 언더바(_)를 자주 사용한다고 한다.
# 1부터 9까지의 자연수를 더하기summary = 0 fori in range(1, 10):summary+= i# 반복문을 수행하며 , i값을 더하기 위해 # i 값이 필요하니 변수를 만듦
# Hello World를 5번 출력for _ inrange(5):
print("Hello World")
# 반복문을 돌며 특정한 값이 필요없고,# 그냥 반복만 하고 싶을 경우이니 _ # 언더바 사용
튜플 자료형
튜플 자료형은 리스트와 유사하지만 다음과 같은 문법적 차이가 있다.
튜플은 한 번 선언된 값을 변경할 수 없다.
리스트는 대괄호 [] 를 이용하지만, 튜플은 소괄호 () 를 이용한다.
튜플은 리스트에 비해 상대적으로 공간 효율적이다.
# 튜플 사용 예제a = (1, 2, 3, 4, 5, 6, 7, 8, 9)
# 네 번째 원소만 출력print(a[3])
# 두 번째 원소부터 네 번째 원소까지print(a[1:4])
튜플내의 값을 변경하려 한다면( ex : a[2] = 7),
tuple 객체의 값은 Immutable(불변)이니 변경하지 못한다고 에러가 뜸
튜플을 사용하면 좋은 경우
서로 다른 성질의 데이터를 묶어서 관리해야 할 때
최단 경로 알고리즘에서는 (비용, 노드 번호)의 형태로 튜플 자료형을 자주 사용함
예를 들어 , 학생의 학번, 성적과 같이 다른 성질의 데이터를 묶을 때. 다양한 정보를 포함 가능
데이터의 나열을 해싱의 키 값으로 사용해야 할 때
튜플은 변경이 불가능하므로 리스트와 다르게 키 값으로 사용될 수 있다.
리스트보다 메모리를 효율적으로 사용해야 할 때 .
집합 자료형
집합은 다음과 같은 특징이 있다.
중복을 허용하지 않음
순서가 없음
집합은 리스트 혹은 문자열을 이용해서 초기화 할 수 있다.
이때 set() 함수를 이용함.
혹은 중괄호안에 각 원소를 콤마(,)를 기준으로 구분하여 삽입함으로써 초기화 할 수 있다.
데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있다.
# 집합 자료형 초기화 방법 1data = set([1, 1, 2, 3, 4, 5 ]) -> 중복이 제거 된 후, 집합 자료형으로 됨.
# 집합 자료형 초기화 방법 2data = {1, 1, 2, 3, 4, 4, 5}
# 집합 자료형으 ㅣ연산a = {1, 2, 3, 4, 5}
b = {3, 4, 5, 6, 7}
# 합집합print(a | b)
# {1, 2, 3, 4, 5, 6, 7}# 교집합print(a&b)
# {3, 4, 5}# 차집합print( a - b)
# {1, 2}
기본 입출력
input() 함수는 한 줄의 문자열을 입력 받는 함수.
map() 함수는 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용.
# 공백을 기준으로 구분된 데이터를 입력 받을 때는 다음과 같이 사용
list(map(int, input().split()))
# 공백을 기준으로 구분된 데이터의 개수가 많지 않다면, 단순히 다음과 같이 사용
a, b, c = map(int, input().split()) -> 바로 a, b, c 변수에 할당 가능
빠르게 입력 받기
사용자로부터 입력을 최대한 빠르게 받아야 하는 경우가 있음
파이썬의 경우 sys 라이브러리에 정의돼 있는 sys.stdin.readline() 메서드를 이용함.
단 입력 후 엔터가 줄 바꿈 기호로 입력되므로 rsstrip() 메서드를 함께 사용함.
조건문과 반복문
조건문에서 아무것도 처리하고 싶지 않을때 pass 키워드를 사용한다고한다.
예시 ) 디버깅 과정에서 일단 조건문의 형태만 만들어 놓고 조건문을 처리하는 부분은 비워놓고 싶은 경우
score = 85if score >= 80:
pass# 나중에 작성할 소스코드else:
print('성적이 80점 미만입니다')
print('프로그램을 종료합니다')
# 결과 : 프로그램을 종료합니다
# 람다 표현식으로 구현한 두 매개변수의 합 구하기# 이름 없는 함수라고도 불림 (ㄷ ㄷ 처음 앎)print((lambda a, b : a + b)(3,7))
# 예시: 내장 함수에서 자주 사용되는 람다 함수
array = [('홍길동', 50), ('이순신', 32)]
# 각 원소들이 튜플 형태로 구성되어 있음print(sorted(array, key=lambda x : x[1])
# 어떠한 튜플이나 리스트와 같은 원소가 있을때, 얘의 두번째 (여기서는 점수 -> 1번째 값)# 튜플의 2번째 값을 기준으로 정렳할 수 있음# 정렬 기준 (key 속성)를 람다함수를 사용함.
# 여러 개의 리스트에 적용
list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10]
result = map(lambda a, b: a+b, list1, list2)
# map 함수는 각각의 원소에 대해 어떠한 함수를 적용하는 것임# 따라서 list1과 list2의 각각의 원소를 더함# 각각의 순서에 맞는 값끼리 더함 -> 1 +6, 2+7, 3+8 ...