본문 바로가기

Codestates AI 부트캠프/5. CS Fundamental

1-1 Programming

1. 정규표현식

 

- 원하는 구조의 문자열 추가

 

# 원하는 구조의 문자열 추출
# 'col'로 시작하며 하나의 문자열 후에 'r'이 오는 문자형 자료 찾기

import re

wordlist = ["color", "colour", "work", "working",
            "fox", "worker", "working"]

for word in wordlist:
    if re.search('col.r', word):
        print(word)
        
# >>> color

# 만약 'col..r'로 설정하면 colour가 출력되고
# 'col.*r'로 설정하면 color, colour 둘다 출력된다. ('.*'는 임의의 문자열 의미)

 

- 문자열의 특정 패턴 확인

 

# re.match(pattern, str)
# match는 문자열의 시작에서만 패턴 검색 / search는 전체에서 검색
# <과 > 사이에 오는 모든 문자열을 찾으라는 뜻이며
# span()은 해당되는 부분의 시작 인덱스부터 끝 인덱스 반환

print(re.match('<html>', regular_expressions))
print(re.match('<html>', regular_expressions).span())

# >>> <re.Match object; span=(0, 6), match='<html>'>
# >>> (0, 6)

 

- phone number 형식 지정

 

# '010-숫자 네개-숫자 네개' 형식
phone = re.compile("""010-\d{4}-\d{4}""")

info = ['홍길동 010-1234-1234', '고길동 010-5678-5679']

for text in info:
    match_object = phone.search(text)
    print(match_object.group()) # matching된 부분 추출
    
# >>> 010-1234-1234
# >>> 010-5678-5679

 

- '/r'

 

# '/r'는 현재 활성 위치를 현재 라인의 시작 위치로 옮기는 역할
print("    \rHello")
print("     Hello")

# >>> Hello
# >>>     Hello

 

- 문자열 앞 r의 의미

 

# 문자열 앞에 r을 붙이면 raw string이라는 뜻. 문자열 내용이 그대로 출력된다

print('raw string을 사용하지 않고\b 문자 출력하기')
print(r'raw string을 사용하지 않고\b 문자 출력하기')

# >>> raw string을 사용하지 않고 문자 출력하기
# >>> raw string을 사용하지 않고\b 문자 출력하기

# 파일 경로 출력하기
print('C:\programs\nayana')
print('C:\\programs\\nayana')
print(R'C:\programs\nayana')

# >>> C:\programs #'\n' 때문에 줄바꿈
# >>> ayana
# >>> C:\programs\nayana
# >>> C:\programs\nayana

 

2. 다양한 메소드 활용

 

# .rjust
# 원하는 문자로 문자열 앞부분 채우기
print('2'.rjust(3,'0'))
print('good'.rjust(10,'a'))

# >>> 002
# >>> aaaaaagood

 

# .zfill
# 0으로 문자열 앞부분 채우기
print('a'.zfill(5))

# >>> 0000a

 

# split

my_string = "Hello, I am Jack and I am a data scientist"

str_list = my_string.split()
print(str_list)
# >>> ['Hello,', 'I', 'am', 'Jack', 'and', 'I', 'am', 'a', 'data', 'scientist']

str_list2 = my_string.split(",")
print(str_list2)
# >>> ['Hello', ' I am Jack and I am a data scientist']

print(my_string.startswith('Hello'))
# >>> True

print(my_string.endswith('tist'))
# >>> True

print(my_string.replace("Jack", "John"))
# >>> Hello, I am John and I am a data scientist
# replace 결과를 변수에 담아주어야 저장할 수 있다

 

# 얕은 복사

fruits = {"apple", "banana", "cherry"}
fruits_copy = fruits.copy()
print(fruits_copy)
# >>> {'cherry', 'banana', 'apple'}


# B가 A를 참조하고 있기에 B에서 자료를 삭제하니 A에도 적용이 됐다
A = {'a': 5, 'b': 4, 'c': 8}
B = A
del B['a']
print(B)
# >>> {'b': 4, 'c': 8}
print(A)
# >>> {'b': 4, 'c': 8}


# 아래 경우에는 복사한 자료에 변화를 주어도 원래 자료는 변화하지 않았다
# 다만 원래 자료를 복사했다면 복사한 자료의 변화가 있었을 것 
import copy
A = {'a': 5, 'b': 4, 'c': 8}
B = copy.copy(A)
del B['a']
print(B)
# >>> {'b': 4, 'c': 8}
print(A)
# >>> {'a': 5, 'b': 4, 'c': 8}

 

# 깊은 복사 : 내부의 객체들까지 새롭게 copy되는 것. 완전한 새로운 변수를 만드는 것이다

import copy

list_var = [[1,2],[3,4]] # 원래 자료
list_var_deepcopy = copy.deepcopy(list_var) # 깊은 복사
list_var_copy = copy.copy(list_var) # 얕은 복사

list_var[1].append(5)

print(list_var)
# >>> [[1, 2], [3, 4, 5]]

print(list_var_deepcopy)
# >>> [[1, 2], [3, 4]]

print(list_var_copy)
# >>> [[1, 2], [3, 4, 5]]

# 원래 자료를 바꾸자 얕은 복사 자료에는 영향을 주었고, 깊은 복사 자료에는 영향을 주지 않았다

 

3. 반복문과 조건문

 

# dict 자료형에 반복문 적용
# key가 차례대로 추출된다

mock_data = {
  "id": 1,
  "first_name": "states",
  "last_name": "code",
  "email": "code@states.com",
  "gender": "Female",
  "ip_address": "123.123.123.23"
}

for x in mock_data:
    print(x) 
# >>> id, first_name, last_name, email, gender, ip_address

 

# key만 추출하기
for x in mock_data.keys():
    print(x)

 

# value만 추출하기
for x in mock_data.values():
    print(x)

 

# .item()을 이용해 key와 value 한꺼번에 추출
for x in mock_data.items():
    print(x)
# >>> ('id', 1), ('first_name', 'states'), ('last_name', 'code'), ('email', 'code@states.com'), ('gender', 'Female'), ('ip_address', '123.123.123.23')


for k,v in mock_data.items():
    print(k,v)
    
# >>> id 1, first_name states, last_name code, email code@states.com, gender Female, ip_address 123.123.123.23

 

# 각 리스트 속 자료를 튜플형으로 순서대로 짝지어 출력

a = [1,2,3,4,5]
b = [10,20,30,40,50]
c = zip(a,b)
print(list(c))

# >>> [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50)]

 

# 반복문과 zip

a = [1,2,3,4,5]
b = [10,20,30,40,50]
c = [100,200,300,400,500]
for x,y,z in zip(a,b,c):
    print(x,y,z)

 

# break와 continue의 차이

# continue 예제
for i in range(1, 6):
    if i == 3:
        continue
    print(i)

# >>> 1, 2, 4, 5

# break 예제
for i in range(1, 6):
    if i == 3:
        break
    print(i)

# continue는 그 자리에서 곧장 for문으로 다시 돌아가서 다음 순번을 수행한다
# break는 그 자리에서 코드 수행 자체를 중단한다

# 1, 2

 

4. 컬렉션 자료형 내장 메소드

 

# append()

my_list = []
for i in range(1000, 2200):
    if (i%7==0) and (i%5!=0):
        my_list.append(str(i))

print(','.join(my_list))

 

# append(), extend(), insert()

# append()
# list 끝에 새로운 요소 추가 (단일 요소만 가능)
my_list = [1, 2, 3]
my_list.append([4, 5])
print(my_list)  
# >>> [1, 2, 3, [4, 5]]

# extend()
# 여러개의 요소를 한번에 추가할 수 있음
my_list = [1, 2, 3]
my_list.extend([4, 5])
print(my_list) 
# >>> [1, 2, 3, 4, 5]

# insert()
# 원하는 위치에 데이터를 삽입할 수 있음
my_list = [1, 2, 3]
my_list.insert(0, 4)
print(my_list)
# >>> [4, 1, 2, 3]

# 자료 삽입을 하는 또 다른 방법
my_list = [1, 2, 3, 4, 5]
my_list[0] = 99
print(my_list)
# >>> [99, 2, 3, 4, 5]

 

# append와 extend 두 메소드의 차이점에 주의하자

# '리스트' 추가  
flavors1 = ['Vanilla', 'Chocolate']
flavors1.append(['Strawberry', 'MintChocolate'])
print(flavors1)
# >>> ['Vanilla', 'Chocolate', ['Strawberry', 'MintChocolate']]

flavors2 = ['Vanilla', 'Chocolate']
flavors2.extend(['Strawberry', 'MintChocolate'])
print(flavors2)
# >>> ['Vanilla', 'Chocolate', 'Strawberry', 'MintChocolate']


# '문자열' 추가
flavors3 = ['Vanilla', 'Chocolate','Strawberry']
flavors3.append('MintChocolate')
print(flavors3)
# >>> ['Vanilla', 'Chocolate', 'Strawberry', 'MintChocolate']

flavors4 = ['Vanilla', 'Chocolate','Strawberry']
flavors4.extend('MintChocolate')
print(flavors4)
# >>> ['Vanilla', 'Chocolate', 'Strawberry', 'M', 'i', 'n', 't', 'C', 'h', 'o', 'c', 'o', 'l', 'a', 't', 'e']

 

# input()을 이용해 직접 자료 입력 받아 리스트 형태로 반환하기

words = []
while True:
    char = input()
    if char:
        words.append(char.upper())
    else:
        # while 문을 통해 char = input() 의 입력을 계속해서 받으므로,
        # 입력할 데이터가 끝났으면 아무것도 입력하지 않고 엔터를 입력한다.
        break;

print(words)

 

# 숫자를 문자열로 바꾸어 첫번째 자리, 세번째 자리의 수 각각에 조건 걸기
# 첫번째 자리와 마지막 자리를 짝수로

values = []
for i in range(100, 300):
    char = str(i)

    if (int(char[0])%2==0) and (int(char[2])%2==0):
        values.append(char)

print(",".join(values))

# >>>200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298

 

# del, remove, pop

# del
# 지울 자료의 위치를 지정한다
my_list = [1, 2, 3, 4, 5]
del my_list[2]
print(my_list)
# >>> [1, 2, 4, 5]


# remove
# 지울 자체 자체를 입력해서 지우되 중복 자료가 있다면 첫번째 자료만 지운다
my_list = [1, 2, 3, 2, 4]
my_list.remove(2)
print(my_list)
# >>> [1, 3, 2, 4]


# pop
# 리스트에서 꺼냄과 동시에 변수에 넣어 쓸 수 있다
my_list = [1, 2, 2, 4, 5]
removed_element = my_list.pop(2)
print(my_list)
print(removed_element)
# >>> [1, 2, 4, 5]
# >>> 2


# 인스턴스에 아무것도 쓰지 않으면 맨 끝의 자료를 삭제한다
my_list = [1, 2, 3, 4, 5]
my_list.pop()
print(my_list)
# >>> [1, 2, 4]

 

# index, count

# index
# 자료를 검색해 index 번호를 찾을 수 있다

my_list = ['xyz', 'XYZ', 'abc', 'ABC']
print("Index for xyz : ",  my_list.index( 'xyz' ))
print("Index for ABC : ",  my_list.index( 'ABC' ))
# >>> Index for xyz :  0
# >>> Index for ABC :  3


# count
# 자료의 갯수를 세어준다
my_list = ['xyz', 'XYZ', 'abc', 'ABC']
print("Count for xyz : ",  my_list.count( 'xyz' ))
print("Count for ABC : ",  my_list.count( 'ABC' ))
# >>> Count for xyz :  1
# >>> Count for ABC :  1

 

# enumerate
# 리스트 자료형에 대해 각각의 index와 value를 함께 반환한다

li = [12,24,35,70,88,120]
for (i,x) in enumerate(li):
   if i not in (0,3,5):
     li = x
print(li)

 

5. 람다

 

# 함수 정의
define_word = (lambda word, define : word * define)

# 함수 호출
define_word('cat', 5)

# >>> 'catcatcatcatcat'

 

# map()
# map(function, iterable) : 먼저 람다 또는 적용할 함수를 쓰고, 그 다음 함수를 적용할 리스트 또는 튜플을 쓴다
# 이렇게 반환된 내용은 list에 넣거나 for문을 통해 쓸 수 있다

spelling = ["test1", "test2", "test4 test5", "test3"]

shout_spells = map(lambda item : item + ('!!!'), spelling)

print(list(shout_spells))

# >>> ['test1!!!', 'test2!!!', 'test4 test5!!!', 'test3!!!']

 

# filter()
# filter(function, iterable) : 위의 map과 비슷하게 적용할 조건과 대상을 쓴다
# 적용 대상 중에서 조건에 맞는 자료만을 반환한다

fellowship = ['frodo', 'samwise', 'merry', 'pippin', 'aragorn', 'boromir', 'legolas', 'gimli', 'gandalf']

result = filter(lambda member : len(member) > 6, fellowship)

print(list(result))

# >>> ['samwise', 'aragorn', 'boromir', 'legolas', 'gandalf']

 

# reduce()
# 리스트 내의 모든 값을 더하거나 곱할 때 쓸 수 있다

from functools import reduce
stark = ['robb', 'sansa', 'arya', 'brandon', 'rickon']
result = reduce(lambda item1, item2 : item1+item2, stark)
print(result)

# >>> robbsansaaryabrandonrickon