본문 바로가기
Programming/Code Archive

[파이썬Python] 코딩 속도를 높여줄 필수 코드(code snippet) 20개

by 지표덕후 2021. 9. 11.

파이썬은 군더더기가 없는 프로그래밍 언어입니다. 이 언어는 높은 가독성과 단순한 설계로 단숨에 큰 인기를 얻었습니다. 파이썬의 철학을 시적으로 표현한 어느 문장에서도 표현하다시피,

아름다움이 추함보다 낫고
명시적인 것이 암시적인 것보다 낫습니다.

코드를 설계할 때 일반적으로 널리 사용되는 몇 가지 팁들을 숙지해두면 파이썬을 더 아름답고 직관적으로 사용할 수 있습니다. 또 이런 것을 기억해두면 매번 문제를 해결하기 위해 Stack Overflow를 뒤져야 하는 수고도 줄일 수 있습니다.

일상적으로 코딩을 하다보면 아래 팁들이 얼마나 편리한지 알게 되실 겁니다.


1. 문자열(String) 순서 뒤집기(Reverse)

아래 코드뭉치(snippet)는 파이썬에서 string이나 list를 자를 때 흔히 사용되는 슬라이싱 명령어인데, 다음과 같이 반환되는 결과값의 순서를 역순으로 바꿀 수 있습니다.

# Reversing a string using slicing

my_string = "ABCDE"
reversed_string = my_string[::-1]

print(reversed_string)

# Output
# EDCBA

 

자세한 내용은 이 글을 참고해보세요.

 

 

2. "Using The Title Case"처럼 문장을 구성하는 각 단어의 첫 문자를 대문자로

다음의 코드뭉치(code snippet)는 string을 타이틀로 바꿔줍니다. 즉, 문자열을 구성하는 각 단어들의 두문자를 대문자로 바꾸어줍니다. string class에 있는 title()이라는 간단한 메서드(method)로 구현할 수 있습니다.

my_string = "my name is chaitanya baweja"

# using the title() function of string class
new_string = my_string.title()

print(new_string)

# Output
# My Name Is Chaitanya Baweja

 

3. 문자열을 구성하는 유니크한 요소(Unique Element)들 찾기

아래의 코드 뭉치는 string을 구성하는 유니크한 요소(element)들을 찾을 때 사용합니다. set의 요소들은 모두 유니크하다는 속성을 이용한 것입니다.

my_string = "aavvccccddddeee"

# converting the string to a set
temp_set = set(my_string)

# stitching set into a string using join
new_string = ''.join(temp_set)

print(new_string)

 

4. 문자열이나 List를 N개 복제(반복)하기

list나 string들을 가지고 곱하기(*)를 사용할 수 있습니다. 이 구문을 사용하면 list나 string을 우리가 원하는 만큼 반복시킬 수 있습니다.

 

n = 3 # number of repetitions

my_string = "abcd"
my_list = [1,2,3]

print(my_string*n)
# abcdabcdabcd

print(my_list*n)
# [1,2,3,1,2,3,1,2,3]

 

아래와 같이 0에  n을 곱한다면 당연히 0이 나와야겠지만, 여기서 n은 0이라는 요소(element)를 가진 list의 길이를 의미하게 됩니다.

n = 4
my_list = [0]*n # n denotes the length of the required list
# [0, 0, 0, 0]

 

5. 리스트 내포 혹은 리스트 콤프리헨션 List Comprehension

list 내포(comprehension)는 다른 list들을 기반으로 새로운 list를 생성하는 엘레강스한 방법입니다. 아래 코드뭉치는 기존 list의 각 요소(element)에 2를 곱해서 새로운 list를 생성합니다.

# Multiplying each element in a list by 2

original_list = [1,2,3,4]

new_list = [2*x for x in original_list]

print(new_list)
# [2,4,6,8]

 

이 글에서 추가적인 내용을 얻을 수 있습니다.

 

6. 두 변수에 할당된 값을 뒤바꾸기(Swap)

파이썬은 두 개의 변수를 다른 임시 변수에 할당하지 않고도 손쉽게 뒤바꿀 수 있는 기능을 제공합니다.

a = 1
b = 2

a, b = b, a

print(a) # 2
print(b) # 1

 

7. 문자열을 구성하는 부분 문자열(Substring)들을 리시트로 만들기

split() 메서드를 사용하면 하나의 string을 쪼개서 몇 개의 하위 string으로 이루어진 list를 만들 수 있습니다. 이 때 어떤 구분자(separator, 가령 "\t", “,”, "/" 등)를 기준으로 string을 쪼갤 건지도 인자(argument)로 지정할 수 있습니다. 

string_1 = "My name is Chaitanya Baweja"
string_2 = "sample/ string 2"

# default separator ' '
print(string_1.split())
# ['My', 'name', 'is', 'Chaitanya', 'Baweja']

# defining separator as '/'
print(string_2.split('/'))
# ['sample', ' string 2']

 

 

8. 문자열로 이루어진 리스트를 합쳐서 하나의 문자열로 만들기

join() 메서드는 string들을 요소(element)로 가지는 하나의 list를 특정 인자와 함께 결합하여 하나의 stirng으로 만들어줍니다. 아래 사례에서는 콤마(,)를 기준으로 list의 요소들을 하나의 string으로 결합했습니다.

list_of_strings = ['My', 'name', 'is', 'Chaitanya', 'Baweja']

# Using join with the comma separator
print(','.join(list_of_strings))

# Output
# My,name,is,Chaitanya,Baweja

 

9. 주어진 문자열이 Palindrome(회문: 거꾸로 읽어도 동일)인지 아닌지 확인하는 스크립트

string을 역순으로 뒤바꾸는 방법은 이미 알려드렸습니다. 그 방법을 이용하면 palindromes(회문: 거꾸로 읽을 때나 제대로 읽을 때나 동일한 문장, 낱말, 숫자, 문자열)을 파이썬에서는 아주 손쉽게 만들 수 있습니다.

my_string = "abcba"

if my_string == my_string[::-1]:
    print("palindrome")
else:
    print("not palindrome")

# Output
# palindrome

 

10. 리스트에서 요소(Element)들이 몇 번 출현하는지 확인

list에서 요소(element)들이 얼마나 출현하는지 확인하는 여러 가지 방법이 있지만, 제가 가장 좋아하는 방법은 Counter 클래스를 활용하는 것입니다. 파이썬의 Counter는 list와 같은 컨테이너(container) 안에의 각 요소들이 얼마나 자주 출현하는지 계속 추적합니다. Counter()는 각 요소를 key로, 출현빈도를 value로 하는 dictionary를 반환(return)해줍니다.

# finding frequency of each element in a list
from collections import Counter

my_list = ['a','a','b','b','b','c','d','d','d','d','d']
count = Counter(my_list) # defining a counter object

print(count) # Of all elements
# Counter({'d': 5, 'b': 3, 'a': 2, 'c': 1})

print(count['b']) # of individual element
# 3

print(count.most_common(1)) # most frequent element
# [('d', 5)]

 

11. 두 문자열이 Anagram(어구전철)인지 아닌지 판별하는 스크립트

애너그램(어구전철: 단어나 문장을 구성하고 있는 문자의 순서를 바꾸어 다른 문장이나 단어를 만드는 놀이)을 찾을 때 Counter 클래스가 유용하게 사용될 수 있습니다. 만약 두 string 객체의 Counter가 동일하다면, 두 string은 애너그램이라 볼 수 있습니다.

from collections import Counter

str_1, str_2, str_3 = "acbde", "abced", "abcda"
cnt_1, cnt_2, cnt_3  = Counter(str_1), Counter(str_2), Counter(str_3)

if cnt_1 == cnt_2:
    print('1 and 2 anagram')
if cnt_1 == cnt_3:
    print('1 and 3 anagram')

 

12. try-except 구문에 else를 더해 유용성 높이기

try/except 구문을 사용하면 에러를 쉽게 다룰 수 있습니다. 거기에 더해 아래와 같이 else: 선언문을 첨가하면 try/except 구문이 더 유용해질 겁니다. try 구문에서 exception이 활성화되지 않는 경우 작동합니다. 

만약 exception와 무관하게 무언가를 작동시키고 싶다면 finally: 을 사용하시면 됩니다.

a, b = 1,0

try:
    print(a/b)
    # exception raised when b is 0
except ZeroDivisionError:
    print("division by zero")
else:
    print("no exceptions raised")
finally:
    print("Run this always")

 

13. for 구문에 enumerate을 사용하여 List 내의 Value와 Index를 쌍으로 활용

아래 스크립트는 enumerate를 사용해 list의 값들을 그 index와 함께 순차적으로 반환합니다.

my_list = ['a', 'b', 'c', 'd', 'e']

for index, value in enumerate(my_list):
    print('{0}: {1}'.format(index, value))

# 0: a
# 1: b
# 2: c
# 3: d
# 4: e

 

14. 특정 객체가 차지하고 있는 메모리 규모 확인

아래 스크립트는 특정 객체가 메모리를 얼마나 사용하고 있는지 체크합니다.

import sys

num = 21

print(sys.getsizeof(num))

# In Python 2, 24
# In Python 3, 28

 

15. 두 개의 Dictionary 데이터 병합(Merge)하기

파이썬2.x 버전에서는 두 개의 dictionary들을 병합합하기(merge) 위해 upadate() 메서드를 사용했는데, 파이썬 3.5버전에서는 과정이 더 쉬워졌습니다. 아래 스크립트에서 두 개의 dictionary들이 병합되었는데, 특정 key가 두 dictionary 객체 모두에 포함된 교집합인 경우, 두 번째 disctionary의 value가 사용되었습니다(아래 예시에서의 key값 "banana").

dict_1 = {'apple': 9, 'banana': 6}
dict_2 = {'banana': 4, 'orange': 8}

combined_dict = {**dict_1, **dict_2}

print(combined_dict)
# Output
# {'apple': 9, 'banana': 4, 'orange': 8}

 

16. 코드뭉치(Snippet) 실행하는 데 소요되는 시간 확인하기

아래 코드뭉치들은 time 라이브러리를 사용하여, 특정 코드가 수행 완료되는 데에 걸린  시간을 계산합니다.

import time

start_time = time.time()
# Code to check follows
a, b = 1,2
c = a+ b
# Code to check ends
end_time = time.time()
time_taken_in_micro = (end_time- start_time)*(10**6)

print(" Time taken in micro_seconds: {0} ms").format(time_taken_in_micro)

 

17. 리스트(List)들을 품고 있는(Nesting) 다차원 리스트를 단일 리스트로 차원 축소(Flattening)

list 안에 list 품어져있는 경우 그 depth를 쉽게 식별하기 어려울 수 있습니다. 그리고 depth 없이 list 내 모든 요소(element)들을 그냥 하나의 list로 변환시키고 싶을 수도 있습니다. 그 때 아래 코드뭉치를 참고하면 됩니다.

from iteration_utilities import deepflatten

# if you only have one depth nested_list, use this
def flatten(l):
  return [item for sublist in l for item in sublist]

l = [[1,2,3],[3]]
print(flatten(l))
# [1, 2, 3, 3]

# if you don't know how deep the list is nested
l = [[1,2,3],[4,[5],[6,7]],[8,[9,[10]]]]

print(list(deepflatten(l, depth=3)))
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

만약 적절한 형식의 array를 가지고 동일한 작업을 수행하고자 한다면, Numpay flatten이 더 나은 방식일 수도 있습니다.

 

18. 리스트(List)에서 요소(Element)들을 샘플요소를 무작위로 추출(Sampling)

아래 코드뭉치는 random 라이브러리를 사용해서 주어진 list로부터 요소(element)들을 무작위로 추출해 표본(sample) list를 생성합니다. 이 때 추출될 요소의 수를 지정할 수 있습니다.

import random

my_list = ['a', 'b', 'c', 'd', 'e']
num_samples = 2

samples = random.sample(my_list,num_samples)
print(samples)
# [ 'a', 'e'] this will have any 2 random values

 

암호화(cryptography)를 목적으로 무작위 표본을 만든다면 secrets 라이브러리를 추천합니다. 다만 아래 코드뭉치는 파이썬 3.x 버전에서만 작동합니다.

import secrets                              # imports secure module.
secure_random = secrets.SystemRandom()      # creates a secure random object.

my_list = ['a','b','c','d','e']
num_samples = 2

samples = secure_random.sample(my_list, num_samples)

print(samples)
# [ 'e', 'd'] this will have any 2 random values

 

19. 정수를 10진법 숫자로 이루어진 하나의 리스트(List)로 변환(Digitize)

아래 코드뭉치는 하나의 정수를 10진법 숫자로 이루어진 하나의 list로 변환시켜줍니다.

num = 123456

# using map
list_of_digits = list(map(int, str(num)))

print(list_of_digits)
# [1, 2, 3, 4, 5, 6]

# using list comprehension
list_of_digits = [int(x) for x in str(num)]

print(list_of_digits)
# [1, 2, 3, 4, 5, 6]

# Even simpler approach
list_of_digits = list(str(num))

print(list_of_digits)
# [1, 2, 3, 4, 5, 6]

 

20. 리스트 내 모든 요소(Element)들이 유니크한 값인지(=한 번씩만 포함되어 있는지) 확인

아래 함수는 한 list 내의 모든 요소(element)들이 유니크한 값인지 아닌지 체크해줍니다.

def unique(l):
    if len(l)==len(set(l)):
        print("All elements are unique")
    else:
        print("List has duplicates")

unique([1,2,3,4])
# All elements are unique

unique([1,1,2,3])
# List has duplicates

 

위의 코드뭉치들은 짧지만 파이썬 코딩작업에서 아주 유용하게 사용됩니다. 여러분들께도 부디 그랬으면 좋겠네요!

댓글