본문 바로가기
IT/엘리스 AI 트랙

[엘리스 AI 트랙 2기] 11주차 - 데이터 분석

by 무녈 2021. 9. 5.

자료의 출처는 '엘리스 AI 트랙 2기 (https://aitrack.lms.elice.io/)' '데이터 분석 핵심 분석'이며, 학습 후 정리한 내용입니다.

⚡️올바르지 않은 내용이 있을 경우 댓글로 남겨주시면 감사하겠습니다.⚡️


레이서 블로거로써의 시작

엘리스 AI 트랙 2기 11주 차가 시작되면서, 레이서 블로거로 선정되었다.

매주 또는 격주 엘리스 AI 트랙을 통해 배운 내용들을 정리하고, 저의 경험 또는 생각들을 담아 글을 작성할 예정이다!

 

엘리스 AI 트랙 11주부터 데이터 분석과 관련된 수업이 진행이 되며, 다양한 코치님들과 함께 수업에 참여할 수 있었다.

 

이번 주부터 데이터 분석 수업은, 수요일과 금요일은 실시간 강의가 진행되고, 나머지 요일인 월, 화, 목은 엘리스에서 제공하는 온라인 강의로 진행이 된다.

 

실시간 수업은 이론과 실습 시간으로 나뉘게 되며, 이론 수업의 경우 한 코치님께서 AI트랙 참여자 전원을 대상으로 이론 수업 및 현업에서의 경험에 대해 말씀해주시고, 실습수업의 경우, 레이서분들을 분반하여 각 반을 담당하는 코치님께서 실습 문제 위주의 수업이 이루어진다.

 

이번 주 데이터 분석 이론을 담당하신 김동환 코치님께서는 쿠팡 등에서 근무하셨던 화려한 경력을 가지신 분! (정말 존경스럽습니다)

정말 착하고 선하시고 수업 진행방식이 훌륭하셨다. 데이터 분석을 거의 처음 접한다고 봐도 무방하기 때문에 실시간 강의 전 엘리스 강의 들을 때도 굉장히 무섭고 어려운 과목이라고 생각했는데, 역시나 어려웠고, 힘들었지만

훌륭하신 이론 및 실시간 코치님 덕분에 정말 많이 이해하면서 수업을 들을 수 있었다.

 

이론 담당 코치님 얼굴이 낯이 익어서 어디서 봤나 했더니

(엘리스 AI트랙 3기 레이서 모집)

 

개발자가 되고 싶다면 너, 우리의 동료가 돼라!

최고의 동료와 함께 선배 개발자에게 밀착 코칭 받아 세상을 변화시키는 서비스를 만드는 주역이 되고 싶다면 엘리스 인공지능 서비스 기획 개발 트랙의 레이서에 지원하세요!

elicetrack.oopy.io

엘리스 AI 트랙 모집 공고에 올라오셨던 분을 강의를 통해 만나뵙게 된 것이었다. 
해맑고 웃고 계셨던 게 머리속에 맴돌아서 강의 수업 중에 비친 얼굴 보자마자 바로 찾을 수 있었다 ㅋㅋ

 

데이터 분석에 대한 굉장한 경험을 하신 분이라 그런지 많은 레이서분들이 이해할 수 있도록 난이도를 조절해주시며 최대한 많은 정보를 얻어갈 수 있게 노력해주신 모습도 멋있었다.👍👍👍👍

 

 

 

엘리스 AI 트랙 실시간 강의

줌과 유사한 방식이기도 하지만, 엘리스의 강려크한 온라인 플랫폼을 통해 실시간 강의 또한 무리 없이 들을 수 있다.

이론 코치님께서는 데이터 분석 시 많이 사용하는 Jupyter와 colab 사용법에 대해 알려주신 뒤, 해당 수업은 가급적 jupyter로 진행한다고 말씀해주셨고, 위 이미지와 같이 실시간으로 필기를 해주시며 수업을 진행하셨다.

 

데이터 분석 실습 코치님 또한 매우매우 훌륭한 경험을 하신 분으로 구성되었고, 다른 반 코치님의 수업 방식은 정확히는 모르겠지만 소문으로 대단하신 분인 거 같다.

하지만 우리반 실습 코치님이 최고라.... 너무너무 친절하고 한 명 한 명의 피드백을 반영해주시고 하나라도 더 알려주시려고 애쓰시고 또 노력하신다... 수업을 안 들으려고 해도 이번 수업은 안들을 수 가 없다...(데이터 분석의 길은 너무나 험난하기에 수업에라도 일단 집중모드)

 

한 주간의 모든 수업이 마무리 되었고, 데이터 분석에 대해 1도 몰랐지만 1은 알게 되었던 한 주였다.


다음은 엘리스에서 제공해준 온라인 강의 학습 자료를 바탕으로, 이번 주 배운 내용을 정리 및 궁금한 것들을 조금 더 찾아보고 보완한 내용들이다.


엘리스 온라인 강의

해당 주차 수업은 김건우 강사님께서 진행해주셨는데, 목소리가 너무 익숙해서 어디서 봤지 했더니,

사전에 제공된 엘리스 강의를 통해 이미 한번 경험했던 강사님이셨다. 목소리가 너무 독특하셔서 그때도 신선했는데, 이번에는 위와 같이 직접 대면하는 느낌의 방식으로 톡톡 튀는 목소리까지 들리니 더 신선하면서도, 익숙한 느낌이었다 ㅋㅋㅋㅋ

중간에 질문하시고 화면 멈춤 하는 새로운 스타일의 수업도 신선함으로 느껴졌다.😎

 

파이썬 실전 데이터 분석

데이터 처리

파일 다루기

Python에서는 내장 함수 open을 제공 => 파일을 열 때 사용하는 내장 함수

열기 작업을 성공하면 oepn 함수는 파일 객체를 반환하며

이후에 작업은 파일 객체의 멤버 메서드를 이용하여 쓰기, 읽기, 닫기 등의 작업 수행 가능

 

파일 열기/닫기

file = open(‘data.txt’)
content = file.read()
file.close()

# 파일 개체 변수 = open(파일명[, 접근 모드, 버퍼링])

open 함수는 작업할 파일명을 입력 인자로 전달

 

접근 모드는 해야 할 작업 목적에 맞게 읽기 전용, 쓰기 전용, 읽기/쓰기 등 선택 가능

사용할 수 있는 모드는 r, w, a, b, + 의 조합

이 중에 b와 +는 단독으로 표현할 수 없고 반드시 r, w, a 중에 하나는 표현해야 함.

r은 읽기, w는 쓰기, a는 추가, b는 바이너리 포맷, + 읽기/쓰기를 의미

만약 open 함수에 접근 모드를 전달하지 않으면 읽기 전용

  • 파일이 없을 때
    open 함수에 없는 파일명을 인자로 전달하는 경우,  만약 w, a 모드라면 새로운 파일을 생성한 후에 해당 파일에 작업할 수 있는 파일 인스턴스를 반환
    하지만 r 모드라면 예외를 발생

  • 파일이 있을 때
    r 모드나 a 모드로 열면 정상적으로 열리며 내용에 변화는 없음.
    하지만 w 모드로 열면 기존 파일에 내용은 사라짐.

open은 호출이 완료되면 파일 객체를 반환해줌.

그리고 이 객체를 통해서 읽기, 쓰기 작업이 가능

=> 파일에 대한 작업을 완료하면 파일 객체의 close 메서드로 반드시 닫아주어야 한다.

 

# read, readline

파일 읽기 위해서는 파일 객체의 read류의 메서드들을 사용하여 읽음.

read는 기본적으로 한 글자씩 읽어오는 메서드

활용하는 방식은 파일의 내용이 없을 때까지 출력 read()는 더 이상 읽을 내용이 없으면 빈 문자열을 반환

파일을 읽어오기 위한 메서드는 read(), readline(), readlines()가 있다.
read() : 파일 전체의 내용을 하나의 문자열로 읽어온다. Binary 파일도 읽을 수 있다.
readline() : 한 번에 하나의 라인을 읽어오는 메서드이다.
readlines() : 파일 전체를 한 라인씩 읽어와서 리스트를 만들어주는 메서드이다.
                       개행 문자인 "\n"도 같이 들어가 있기 때문에 이 부분을 제거해주는 comand가 필요할 수도 있다.

출처: Python을 이용한 Report Parsing 및 활용

# close()를 반드시 해야 하는 이유

보통 close()를 인하 시 중요하게 생각하지 않는 사람들이 많은데 프로그램이 금방 끝나기 때문

 

한글 파일을 연 상태에서 그 파일을 삭제시킬 경우, 어디에서 열려있다고 하면서 삭제 동작을 하지 않음.

마찬가지로 프로그램 내에서 파일을 다 사용했는데 열어놓으면 다른 스레드나 프로세스가 쓸 수 없는 상황이 발생

 

문자열 함수

. startwith()

word = "superman"
print(word.startswith('s'))    # True

if word.startswith('a'): 
	print("a로 시작하는 단어입니다.")

문자열에서 많이 사용되는 함수인 startswith() 함수는 사용방법이 매우 간단함.

str.startwith(str or tuple) 형식으로 사용하면 되고, 반한 값으로는 True, False를 반환함.

 

대소문자를 구분하고 인자 값에 있는 문자열이 word에 존재하면 true, 없으면 false를 반환

string을 제외하고 인자 값으로는 tuple 밖에 들어가지 않으며, list나 dict를 넣을 경우 오류가 발생

# list 또는 dictionary type이 인자로 오는 경우

결과

# tuple경우

결과

 

대소문자 변환

intro = "My name is Elice!"
print(intro.upper())
>>> "MY NAME IS ELICE!"
print(intro.lower())
>>> "my name is elice!"

# upper()

string을 대문자로 변경하는 method => string.upper()로 사용

# lower()

string을 소문자로 변경하는 methid => string.lower()로 사용

 

대소문자를 변환하는 method는 append() 등의 method와 달리 원래의 문자열을 직접 수정하지 않는다.

문자열을 직접 수정하지 않는 method

변경된 문자열을 가지기 위해서 새로운 변수를 선언하고 입력해주어야 함.


텍스트 파일 분석

파일 다루기

파일 자동으로 닫기

with open(‘data.txt’) as file:
    content = file.read()
# file.close() — 필요 없음

 with문을 사용하면 with 블록을 벗어나는 순간 열린 파일 객체 file이 자동으로 close가 됨.

 

줄 단위로 읽기

contents = []
with open(‘data.txt’) as file:
    for line in file:
        contents.append(line)

for문을 사용하여 파일 객체 file의 내용을 줄 단위로 읽고 , contents 리스트에 추가하여 사용할 수 있음.

 

파일의 모드

# 쓰기 (Write) 모드로 파일을 연다
with open(‘data.txt’, ‘w’) as file:
    file.write(‘Hello’)

data.txt 파일을 w(쓰기 모드)로 열고, 파일 객체 file에 write를 통해 글을 작성 또는 추가할 수 있음.

데이터 구조 다루기

튜플 (Tupe)

hello = (‘안녕하세요’, ‘hello’, ‘bonjour’) 
apple = (‘사과’, ‘apple’, ‘pomme’)
red = (‘빨갛다’, ‘red’, ‘rouge’)

튜플 vs. 리스트

공통점

  • 순서가 있는 원소들의 집합

차이점

  • 각 원소의 값을 수정할 수 없음
  • 원소의 개수를 바꿀 수 없음

리스트 변형

hello = [‘안녕하세요’, ‘hello’, ‘bonjour’] 
hello[0] = ‘안녕’
# [‘안녕’, ‘hello’, ‘bonjour’]
hello.append(‘ni hao’)
# [‘안녕’, ‘hello’, ‘bonjour’, ‘ni hao’]

리스트는 인덱스에 새로운 값을 넣어줄 경우, 리스트를 변형할 수 있다 -> 리스트는 수정이 가능함.

튜플 변형

hello = (‘안녕하세요’, ‘hello’, ‘bonjour’)
hello[0] = ‘안녕’ # 에러 
hello.append(‘ni hao’) # 그런 함수 없음

# 튜플은 원소의 값을 수정할 수 없다.

 

리스트로 리스트 만들기

words = [‘life’, ‘love’, ‘faith’]
first_letters = []
for word in words:
    first_letters.append(word[0])
print(first_letters)
# ['l', 'l', 'f']
numbers = [1, 3, 5, 7]
new_numbers = []
for n in numbers:
    new_numbers.append(n + 1)
print(new_numbers)
# [2, 4, 6, 8]

리스트로 리스트 만들기의 동일한 내용을 List Comprehension을 사용하면 조금 더 간단하게 코드를 작성할 수 있다.

List Comprehension

words = [‘life’, ‘love’, ‘faith’]
first_letters = [word[0] for word in words]
numbers = [1, 3, 5, 7]
new_numbers = [n + 1 for n in numbers]

특정 원소 걸러내기

numbers = [1, 3, 4, 5, 6, 7]
even = []
for n in numbers:
    if n % 2 == 0:  # numbers 리스트 내 짝수만 새로운 리스트 even에 추가한다.
        even.append(n)

동일한 내용을 List Comprehension을 사용하면 아래와 같이 표현할 수 있다.

numbers = [1, 3, 4, 5, 6, 7]
even = [n for n in numbers if n % 2 == 0]
numbers = [1, 3, 4, 5, 6, 7]
odd = [n + 1 for n in numbers if n % 2 == 0] # numbers 리스트 중 홀수만을 이용하여 odd 리스트에 추가

데이터 정렬하기

파이썬 정렬 sorted 함수

sorted(data)
sorted(data, reverse 파라미터)
sorted(data, key 파라미터)
sorted(data, key 파라미터, reverse 파라미터)

sorted 함수는 파이썬 내장 함수이다.


sorted()는 첫 번째 매개변수로 들어온 iterable data 새로운 정렬된 리스트로 만들어서 반환해 주는 함수

=> 첫 번째 매개변수로 들어올 "정렬할 데이터"는 iterable 한 데이터 이어야 한다.

 

아래 옵션(파라미터)은 다 기본값으로 들어가 있기 때문에 sorted(정렬 데이터)만 넣어도 충분

 

key 옵션(key 파라미터)
sorted 함수의 key 파라미터는 데이터의 정렬에 대한 기준이다.
즉, key 값을 기준으로 비교를 하여 정렬을 하겠다는 것인데, 이것을 정해 줄 수 있는 파라미터이다.
sorted(data , key=function)로 입력하게 되면 해당 키를 기준으로 정렬하여 반환한다.

 

reverse 옵션(reverse 파라미터)
해당 파라미터를 이용하면 오름차순으로 정렬할지 내림차순으로 정렬할지 정할 수 있다.
defualt value는 reverse=False로 오름차순으로 정렬
sorted(data, reverse=True)로 입력하게 되면 내림차순으로 정렬하여 반환


출처: https://blockdmask.tistory.com/466 [개발자 지망생]

* 리스트. sort()와 sorted(리스트)의 가장 큰 차이 *
리스트. sort()는 본체의 리스트를 정렬해서 변환하는 것이고,
sorted(리스트)는 본체 리스트는 내버려 두고, 정렬한 새로운 리스트를 반환하는 것
numbers = [-1, 3, -4, 5, 6, 100]
sort_by_abs = sorted(numbers, key=abs)

# [-1, 3, -4, 5, 6, 100]

numbers 내 리스트를 key 파라미터인 절댓값을 기준으로 정렬한다.

fruits = [‘cherry’, ‘apple’, ‘banana’]
sort_by_alphabet = sorted(fruits)
# [‘apple’, ‘banana’, ‘cherry’]
def reverse(word):
    return str(reversed(word))
fruits = [‘cherry’, ‘apple’, ‘banana’]
sort_by_last = sorted(fruits, key=reverse)
# [‘banana’, ‘apple’, ‘cherry’]

데이터형 변환

딕셔너리

{ key: value }

딕셔너리는 "{}" 중괄호 내 key와 value의 쌍으로 이루어진 data type이다(JSON과 유사한 형태이며, 유사한 형태를 이용하여 많은 작업들이 이루어짐)

key: 값을 찾기 위해 넣어 주는 데이터

value: 찾고자 하는 데이터

empty_dict = {}
new_dict = {
	'apple': '사과', 
    'book': '책', 
    'human': '사람',
}
dictionary = {}  # 빈 딕셔너리 선언
dictionary['apple'] = '사과'
dictionary['book'] = '책' 
dictionary['human'] = '사람' 
print(dictionary['book']) # 책

 

빈 딕셔너리 또는 data가 들어있는 딕셔너리에

dictionary [key] = value 형식을 통해 데이터를 추가할 수 있다.

또한 dictionary [key]를 통해 쌍이 되는 value를 구할 수 있다.

 

딕셔너리의 key

딕셔너리에서 변할 수 없는 값 만이 key가 될 수 있다.

# {[ID, 비밀번호]: 계정 정보}
kdhong = ["kdhong", "cantcalldad"]
accounts = {
   kdhong: ('Kildong Hong', ...),
}
# {[ID, 비밀번호]: 계정 정보}
kdhong = ["kdhong", "cantcalldad"]
accounts = {
   kdhong: ('Kildong Hong', ...),
}
kdhong[0] = "kdhong.elice" #error

list는 원소의 값이 변할 수 있다.

하지만 딕셔너리의 key는 변할 수 없는 값 만이 될 수 있으므로, 딕셔너리의 key로 list를 사용할 경우 TypeError가 발생

이미 key에 리스트 type을 사용할 수 없으므로 리스트[N]와 같이 인덱싱을 통해 값을 변경하는 것 또한 불가능

딕셔너리의 key 확인

# {id: 이름}
accounts = {
    "kdhong": "Kildong Hong",
}
print("kdhong" in accounts)		# True
print("elice" in accounts)		# False

리스트 또는 for문에서 사용되는 in 연산자와 마찬가지로 딕셔너리 또한 in 연산자를 통해 key의 유무를 확인할 수 있음

해당 key가 존재할 경우 True, 존재하지 않을 경우 False를 반환.

 

딕셔너리 순회하기

accounts = {
    "kdhong": "Kildong Hong",
}
for username, name in accounts.items():
    print(username + " - " + name)

items() 메서드를 통해 딕셔너리의 key와 value를 순회할 수 있다.

items 메소드를 통해 key와 value가 튜플의 리스트와 비슷한 형식으로 주어지고,

for 문을 통해 순회가 가능

 

딕셔너리 vs. 리스트

딕셔너리

# {id: 이름}
accounts = {
    "kdhong.elice": "Kildong Hong",
    ...
}
print(accounts["kdhong.elice"])

리스트

# [(id, 이름)]
accounts = [
    ("kdhong.elice", "Kildong Hong"),
    ...
]
# [(아이디, 이름)]
for id_, name in accounts:
    if id_ == "kdhong.elice":
print(name)

리스트의 경우 data 쌍을 이루기 위해 tuple type을 리스트 안에 원소로 입력하게 되며,

해당 id와 쌍을 이루는 data를 찾기 위해 모든 data를 확인해야 한다.

 

JSON

JSON

 { key: value }

 

"JavaScript Object Notation"

JSON은 속성-값 쌍 또는 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해
인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷

- python의 딕셔너리와 유사한 형태이다.

 

특징

  • 웹 환경에서 데이터를 주고받는 가장 표준적인 방식
  • 키를 이용하여 원하는 데이터만 빠르게 추출 가능
  • 데이터가 쉽게 오염되지 않음
  • 다른 포맷에 비해 용량이 조금 큰 편

JSON과 딕셔너리 변환

* JSON -> loads() -> 딕셔너리
* 딕셔너리 -> dumps() -> JSON

loads(): JSON 형태의 문자열을 딕셔너리로 변환
이때 딕셔너리의 모든 원소는 문자열 타입으로 설정

# json을 dict로 바꾸어주는 함수
def create_dict(filename):
  with open(filename) as file:
    json_string = file.read()
    dicts = json.loads(json_string)
    
    return dicts

dumps(): 딕셔너리를 JSON 형태의 문자열로 변환

# dict를 json으로 바꾸로 파일에 써주는 함수
def create_json(dictionary, filename):
  with open(filename, 'w') as file:
      # 함수를 완성하세요.
      json_string = json.dumps(dictionary)
      file.write(json_string)​
더보기

load, loads, dump, dumps 비교

 

[python] json dump/dumps/load/loads 구분하기
출처: https://simryang.tistory.com/entry/python-json-dumpdumpsloadloads-구분하기 [sr's lair]

집합

특징

  • 중복이 없다
  • 순서가 없다

집합 만들기

# 셋 다 같은 값
set1 = {1, 2, 3}      	# 기본적인 집합 형태
set2 = set([1, 2, 3])	# set 함수를 통해 리스트를 집합으로 바꿈
set3 = {3, 2, 3, 1}		# 집합은 중복이 없으므로 {1, 2, 3}과 동일

원소 추가 / 삭제

num_set = {1, 3, 5, 7}
num_set.add(9)
num_set.update([3, 15, 4])
num_set.remove(7)
num_set.discard(13)

원소 추가

add와 update 메서드를 통해 집합에 원소 추가 가능

  • 값 1개 추가하기(add)
    이미 만들어진 set 자료형에 값을 추가할 수 있다. 1개의 값만 추가(add)한다.
  • 값 여러 개 추가하기(update)
    여러 개의 값을 한꺼번에 추가(update)할 때 사용

원소 삭제

원소가 존재한다면, 그 원소를 제거

  • remove
    discard는 이 원소가 존재한다면, 삭제하고, 아니면 무시 
  • discard
    remove는 원소가 존재해야 하며, 없다면 error를 띄움

    각각 사용하는 시점이 다르다.

집합 다루기

num_set = {1, 3, 5, 7}
print(6 in num_set)        # False
print(len(num_set))        # 4

in 연산자를 통해 특정 원소의 존재 여부를 확인 가능

len 함수를 통해 집합의 길이를 나타낼 수 있음

 

집합 연산

 

 

union = set1 | set2 		# 합집합 
intersection = set1 & set2  # 교집합 
diff = set1 - set2 			# 차집합 
xor = set1 ^ set2 			# XOR

복잡한 형태의 데이터 다루기

CSV

CSV

Comma Separated Value

CSV는 몇 가지 필드를 쉼표(, )로 구분한 텍스트 데이터 및 텍스트 파일이다.

확장자는. csv이며 MIME 형식은 text/csv이다. comma-separated variables라고도 함.

 

각 열이 특정한 의미를 가짐

# movies.csv
# 국문 제목,영문 제목,개봉 연도
다크나이트,The Dark Knight,2008 
겨울왕국,Frozen,2013 
슈렉,Shrek,2001 
슈퍼맨,Superman,1978

 

기본적으로 각 column의 구분은 쉼표(,)로 하나, 다른 구분 문자를 사용할 수 있다.

# movies.csv
# 다른 구분 문자(delimiter)도 사용 가능
다크나이트|The Dark Knight|2008 
겨울왕국|Frozen|2013 
슈렉|Shrek|2001 
슈퍼맨|Superman|1978

변환

데이터에 ", "가 포함된 경우

CSV의 장점

 

  • CSV 파일은 숫자나 문자열로 구성되어 있는 표(혹은 스프레드시트) 형태의 데이터가 일반 텍스트 plain-text로 저장됨.
  • 일반 텍스트로 저장되므로 이를 저장하거나 전송하고 처리할 수 있는 프로그램이 다양
    ➡️ 이 점이 엑셀 파일과 비교했을 때 CSV 파일의 가장 큰 장점
  • 엑셀과 같은 스프레드시트 프로그램뿐만 아니라 워드프로세서 또는 간단한 텍스트 편집기로도 CSV 파일을 처리가 가능
  • 같은 데이터를 저장하는 데 다른 data type에 비해 용량을 적게 소모함.

CSV의 단점

  • 데이터 오염에 취약

CSV 파일 불러오기

import csv

with open('movies.csv') as file:
    reader = csv.reader(file, delimiter=',')
    for row in reader:
        print(row[0])

(참고: csv 파일 읽기와 쓰기)

csv모듈의 reader함수를 이용하여 행별로 데이터를 가져와 루프를 돌면 csv 파일을 읽는다. 

delimiter 옵션으로 파일 내에서 구분자가 무엇인지 선언해줄 수 있다.

➡️ 불러온 csv 파일을 reader 변수에 저장하여, for 문을 통해 line별로 접근할 수 있다.

 

고급 파이썬

(참고: 왕초보를 위한 Python)

 

lambda

함수를 생성할 경우, def를 사용해 함수를 생성할 수 있지만, 간단한 함수의 생성의 경우 lambda를 사용하면

더욱 간단히 표현 가능하다.

def square(x):
    return x * x
    
square = lambda x: x * x

 

앞서 배운 sorted 함수의 key에 해당하는 파라미터로 함수를 사용한다.

def get_eng_title(row):
    split = row.split(',')
    return split[1]
    
sorted(movies, key=get_eng_title)

⬇️ lambda로 표현한 경우

1️⃣

get_eng_title = lambda row: row.split(',')[1]
sorted(movies, key=get_eng_title)

2️⃣  함수를 이름 없이 바로 생성하여 key 파라미터로 사용할 수 있다.

sorted(movies,
       key=lambda row: row.split(',')[1])

map

map(함수, 리스트)

리스트로부터 원소를 하나씩 꺼내서 함수를 적용시킨 다음, 그 결과를 새로운 리스트에 담아준다.

* map은 실제로 리스트를 바로 만들어주지 않는다. 
map이라는 type을 가진 데이터 구조를 만듦.
map이라는 타입은 만약 사용자가 만들어진 map에서 원소를 찾을 때, 함수를 적용해서 원소를 새롭게 만들어주는 것이다.
직접  원소를 꺼내기 전에는 실제로 계산하지 않음(그냥 약속만 해둔 것)
➡️ 꺼내가기 전에 함수를 적용시켜서 값을 내어준다.

예시

movies = [
	"다크나이트,The Dark Knight,2008",
	"겨울왕국,Frozen,2013", 
	"슈렉,Shrek,2001", 
	"슈퍼맨,Superman,1978"
]

[List Comprehension을 사용하여 movies의 제목만 가져옴]

def get_eng_title(row):
    split = row.split(',')
    return split[1]
    
eng_titles = \
    [get_eng_title(row) for row in movies]

[map 함수를 통해 movies의 제목만 가져옴]

eng_titles = map(
    lambda row: row.split(',')[1],
    movies
)
eng_titles = map(get_eng_title, movies)
print(eng_titles)
# <map object at 0x104154f98>

✅  리스트가 아닌 map이라는 타입을 가짐 => list 함수를 사용하여 리스트로 변경한 후 출력한다.

eng_titles = [
    "The Dark Knight",
    "Frozen",
    "Shrek",
    "Superman"
]

filter

리스트에 들어있는 원소들을 함수에 적용시켜서 결과가 참인 값들로 새로운 리스트를 만들어준다.

filter(함수, 리스트)

예시

words = ['real', 'man', 'rhythm', ...]
r_words = ['real', 'rhythm', 'right', ...]

[List Comprehension을 사용한 경우]

words = ['real', 'man', 'rhythm', ...]
r_words = [word for word in words if word.startswith('r')]

[filter 함수를 사용한 경우]

1️⃣  filter 파라미터로 사용할 함수를 정의하고 사용하는 경우

def starts_with_r(word):
   return word.startswith('r')
   
words = ['real', 'man', 'rhythm', ...]
r_words = filter(starts_with_r, words)

2️⃣  lambda 사용

starts_with_r = lambda w: w.startswith('r')

words = ['real', 'man', 'rhythm', ...]
r_words = filter(starts_with_r, words)

3️⃣  filter 함수 사용

r_words = filter(starts_with_r, words)
print(r_words)
# <filter object at 0x104154f98>  # 리스트가 아닌 filter 타입을 가짐

# filter를 사용하는 경우 리스타가 아닌 filter 타입을 가지므로 

list 함수를 사용하여 리스트 화한다.

 

reduce

reduce(함수, 시퀀스[, 초기값])

시퀀스(문자열, 리스트, 튜플)의 원소들을 누적해서 함수에 적용

 

예시

from functools import reduce   # 파이썬 3에서는 import 필요
reduce(lambda x, y: x + y, [0, 1, 2, 3, 4])
# 10

초기값이 없는 경우, 시퀀스의 가장 첫 번째 인덱스가 기준이 된다.

먼저 0과 1을 더하고, 그 결과에 2를 더하고, 거기다가 3을 더하고, 또 4를 더한 값을 돌려준다.

한 마디로 전부 다 더하라는 것.

시퀀스 내 원소들을 함수를 통해 누적해서 계산하고, 최종 값을 반환한다.


참고

 

[파이썬] 파일 다루기 - 파일 열기(open), 읽기(read), 쓰기(write), 삭제(remove)

파이썬 파일 다루기(File Handling) 모든 언어에서 파일을 다루는 것은 매우 중요한 일이고 필수적으로 알아두어야합니다. 프로그래밍에서 파일을 읽고 분석하는 작업, 그리고 결과를 기록하여 보

reakwon.tistory.com

 

[python] startswith() 사용방법 정리 @.@

startswith.. 프로그래머스의 전화번호 목록을 풀면서 열심히 공부한 함수다.. [프로그래머스] 전화번호 목록 풀이 [프로그래머스] 전화번호 목록 문제 설명 전화번호부에 적힌 전화번호 중, 한 번

security-nanglam.tistory.com

 

csv — CSV 파일 읽기와 쓰기 — Python 3.9.7 문서

소위 CSV (Comma Separated Values – 쉼표로 구분된 값) 형식은 스프레드시트와 데이터베이스에 대한 가장 일반적인 가져오기 및 내보내기 형식입니다. CSV 형식은 RFC 4180에서 표준화된 방식으로 형식을

docs.python.org

 

3.5 람다(lambda)

오늘은 람다 형식과 그것을 이용하는 여러가지 함수들에 대해서 알아보겠습니다. 당장 완벽하게 소화하실 필요는 없을 것 같구요, 가벼운 마음으로 이런 것이 있다는 정도만 아셔도 ...

wikidocs.net

 

반응형

댓글