IT/언어

[python] 머신러닝을 위한 Python(1)

개발자 두더지 2020. 6. 3. 23:09
728x90

1. Pythonic Code Overview

 많은 언어에서 여러 단어들을 하나로 붙일 때는 아래와 같이 for문 코드를 사용한다.

colors = ['red', 'blue', 'green', 'yellow']
result = ''
for s in colors :
    result += s

그러나 위의 코드를 파이썬답게 작성하면 아래와 같다.

colors = ['red', 'blue', 'green', 'yellow']
result = ''.join(colors)
print(result)

Pythonic 코드를 배워야 하는 이유는 다음와 같다.

1) 남의 코드에 대한 이해도

; 많은 개발자들이 python 스타일로 코딩한다.

2) 효율

; 단순 for loop append보다 list가 조금 더 빠르다.

익숙해지면 코드도 짧아진다.

3) 간지

; 쓰면 왠지 코드 잘 짜는 거처럼 보인다.


2. Pythonic Code - Split & Join

여기서는 Split & Join을 사용하여 String Type의 값을 List 형태로 변환하고, List Type의 값을 String Type의 값으로 변환하는 Pythonic Code 작성법을 알아본다.

1) Split 함수

String Type의 값을 나눠서 List 형태로 변형하는 함수

 컴퓨터가 문자를 이해하기 위한 방법 중 가장 쉬운 방법인 Bag Of Words(; BoW, 문장 안에 단어들이 얼마만큼 포함되어 있는가 카운트 즉 카운트 기반의 단어 표현이라고 할 수 있다.)에 자주 사용된다. 또한 도메인의 점(.)를 기준으로 변수를 저장할 때도 사용할 수 있다.

# 빈칸을 기준으로 문자열 나누기
items = 'zero one two three'.split()
print (items)
>> ['zero', 'one', 'two', 'three']

# ","를 기준으로 문자열 나누기
example = 'python, jquery, javascript'.split(",")
print (example)
>> ['python', ' jquery', ' javascript']

# 리스트에 있는 각 값을 a, b, c 변수로 unpacking
example = 'python, jquery, javascript'
a,b,c = example.split(",")
print(a, b, c)
>> python  jquery  javascript

# "."기준으로 문자열 나누기
example = 'cs50.gachon.edu'
subdomain, domain, tld = example.split('.')

 

2) Join 함수

String List를 합쳐 하나의 String으로 반환할 때 사용
colors = ['red', 'blue', 'green', 'yellow']
result = ''.join(colors)
print(result)
>> redbluegreenyellow

# 연결 시 빈칸 1칸으로 연결
result = ' '.join(colors)

# 연결 시 ", "으로 연결
result = ', '.join(colors)

# 연결 시 "-"으로 연결
result = '-'.join(colors) 

3. Pythonic Code - List Comprehension

 파이썬에서 가장 많이 사용되는 기법 중 하나인 List Comprehension을 사용하여 Pythonic Code를 작성하는 방법에 대해 알아보자.

1) List Comprehensions란

- 기존의 List를 사용하여 간단히 다른 List를 만드는 기법

- 포괄적인 List, 포함되는 리스트라는 의미로 사용됨

- 일반적으로 for+append 보다 속도가 빠름

2) List Comprehensions 코드

# list 만들기
result = [i for i in range(10)]
print(result)
>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# list 만들 때, 필터(; 조건을 만족하는 값만 통과) 적용 (1)
result = [i for i in range(10) if i % 2==0]
print(result)
>> [0, 2, 4, 6, 8]

# Nested For loop
word_1 = "Hello"
word_2 = "World"
result = [i+j for i in word_1 for j in word_2]
print(result)
>> ['HW', 'Ho', 'Hr', 'Hl', 'Hd', 
   'eW', 'eo', 'er', 'el', 'ed', 
   'lW', 'lo', 'lr', 'll', 'ld', 
   'lW', 'lo', 'lr', 'll', 'ld', 
   'oW', 'oo', 'or', 'ol', 'od']

# Nested For loop의 참고사항 ; 조건문에 대괄호([])를 사용하는 경우 결과가 달라진다.
word_1 = "Hello"
word_2 = "World"
result = [[i+j for i in word_1 ]for j in word_2]
print(result)
>> [['HW', 'eW', 'lW', 'lW', 'oW'], 
   ['Ho', 'eo', 'lo', 'lo', 'oo'], 
   ['Hr', 'er', 'lr', 'lr', 'or'], 
   ['Hl', 'el', 'll', 'll', 'ol'], 
   ['Hd', 'ed', 'ld', 'ld', 'od']]

# list 만들 때, 필터(; 조건을 만족하는 값만 통과) 적용 (2) ; i랑 j과 같다면 List에 추가하지 않음
case_1 = ["A", "B", "C"]
case_2 = ["D", "E", "A"]
result = [i+j for i in case_1 for j in case_2 if not(i==j)]
print(result)
>> ['AD', 'AE', 'BD', 'BE', 'BA', 'CD', 'CE', 'CA']

# Two-dimensional lists ; 앞서 말한 조건문에 대괄호([])를 사용하는 경우에 생성되는 list, 이 경우 바깥의 for문이 먼저 고정된다.
words = 'The quick brown fox jumps over the lazy dog'.split()
print(words)
>> ['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']
stuff = [[w.upper(),w.lower(),len(w)] for w in words] # list의 각 요소들을 대문자, 소문자, 길이로 변환해 two dimensional list로 변환
for i in stuff:
  print(i)
>> ['THE', 'the', 3]
   ['QUICK', 'quick', 5]
   ['BROWN', 'brown', 5]
   ['FOX', 'fox', 3]
   ['JUMPS', 'jumps', 5]
   ['OVER', 'over', 4]
   ['THE', 'the', 3]
   ['LAZY', 'lazy', 4]
   ['DOG', 'dog', 3]

참고자료

https://www.edwith.org/aipython/lecture/22951/

https://www.edwith.org/aipython/lecture/22952/

https://www.edwith.org/aipython/lecture/22953/

728x90