본문 바로가기
Python/Pythonic Code

Pythonic Code #1 (split, join, list comprehension, enumerate, zip)

by emilia park 2023. 4. 2.
728x90

[Pythonic Code]

- 파이썬 스타일의 코딩기법이다.

- 파이썬 특유의 문법을 활용하여 효율적인 코드를 작성 가능하다.

- 고급 코드를 작성할 수록 더 많이 필요해진다.

 

* 주요 기법 

split and join

list comprehension

enumerate and zip 

map and reduce

asterisk 

 

* Why Pythonic Code? 

- 다른 코드에 대한 이해도 향상(많은 개발자들이 Pythonic Code 스타일로 코딩) 

- 단순히 for문 + append 하는 것보다 코드도 짧고 빠르

 

* 참고할 서적

- Fluent Python 

- Effective Python(파이썬 코딩의 기술)

- 파이썬 클린코드

# General Code(Pythonic Code X)

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

#출력
# 'redbluegreenyellow'

아래와 비교했을때 General Code가 더 코드가 긴 것을 볼 수 있다.

# Pythonic Code Ex1

colors = ['red','blue','green','yellow']
result = ''.join(colors) #띄어쓰기 없이 붙여라
result

#출력
# 'redbluegreenyellow'
# Pythonic Code Ex2

colors = ['red','blue','green','yellow']
result = '^^'.join(colors) #^^ 붙여라
result

#출력
# 'red^^blue^^green^^yellow'

 

 

a) Split

- string type 의 값을 설정한 기준에 맞추어 나누어준다.

- string.split('ref') : ref 는 string을 끊어주는 기준점이 된다. 

- 띄어쓰기가 포함된 경우 특정 ref에 맞춰 split 하면 띄어쓰기도 같이 따라서 온다.

# Split Ex 

items = 'zero one two three'.split() 
print(items)
#['zero', 'one', 'two', 'three']


example = 'python,java,javascript'
example.split(',')
#['python', 'java', 'javascript']


a,b,c = example.split(',')
print(a,b,c)

#출력
# python java javascript
# Split Ex
example = 'python, java, javascript' #띄어쓰기도 같이 split
for content in example.split(','):
    print(content.strip())

#출력
# python
# java
# javascript

 

 

b) Join

- string type 의 값을 합쳐서 하나의 string 으로 반환한다.

- 'ref'.join(list) : list안에 있는 string 들을 ref를 사이에 두고 합친다.

# Join Ex

colors = ['red','blue','green','yellow']
result = ''.join(colors) #띄어쓰기 없이 붙여라
result

#출력
# 'redbluegreenyellow'


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

#출력
# 'red\nblue\ngreen\nyellow'

 

 

 

c) List Comprehension

- 기존 list를 사용하여 간단히 다른 list 를 만드는 기법이다.

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

- 파이썬에서 많이 사용된다. 

- 단순 for문 + append 기법보다 빠르다.

- [] 안에 list 를 형성할 조건(for문, if문 활용)들을 넣어준다.

 

* for - if 문이 들어갈 때, 

a) if만 들어가면 for문 쓰고 if문

b) if-else문 둘다 들어가면 if문 쓰고 for 문

# General 'for + append'  and List Comprehension

#General
result = []
for i in range(10): 
    result.append(i) 

result

#출력
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


#List Comprehension
result = [i for i in range(10)]
result

#출력 
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# List Comprehension EX

result = [i for i in range(10) if i%2==0]
result

#출력 
# [0, 2, 4, 6, 8]



word1 = '12378' # or 'hello'
word2 = '6486' # or 'world'
result = [i+j for i in word1 for j in word2]
result

#출력
['16',
 '14',
 '18',
 '16',
 '26',
 '24',
 '28',
 '26',
 '36',
 '34',
 '38',
 '36',
 '76',
 '74',
 '78',
 '76',
 '86',
 '84',
 '88',
 '86']
# List Comprehension EX

case_1 = ['a','b','c']
case_2 = ['D','E','A']
result = [i+j for i in case_1 for j in case_2]
result

#출력
# ['aD', 'aE', 'aA', 'bD', 'bE', 'bA', 'cD', 'cE', 'cA']


case_1 = ['a','b','c']
case_2 = ['D','E','c']
result = [j+i for i in case_1 for j in case_2 if not(i==j)]
print(result)

#출력
# ['Da', 'Ea', 'ca', 'Db', 'Eb', 'cb', 'Dc', 'Ec']

result.sort() #문자 순서로 정렬해준다.

#출력 
# ['Da', 'Db', 'Dc', 'Ea', 'Eb', 'Ec', 'ca', 'cb']
# List Comprehension + split 

words = 'The quick brown fox jumps over the lazy dog'.split()
print(words)


stuff = [[w.upper(), w.lower(), len(w)] for w in words]
print(stuff)

for i in stuff: 
    print(i)
    
#출력
['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']
[['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]]
['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]
# List Comprehension : 뒤에 loop를 먼저 돌게 하기 

case_1 = ['A','B','C']
case_2 = ['D','E','A']
result1 = [ i+j for i in case_1 for j in case_2] # i loop first
result2 = [ [i+j for i in case_1] for j in case_2] # j loop first

print(result1)
print(result2) 

#출력
# ['AD', 'AE', 'AA', 'BD', 'BE', 'BA', 'CD', 'CE', 'CA']
# [['AD', 'BD', 'CD'], ['AE', 'BE', 'CE'], ['AA', 'BA', 'CA']]
# List Comprehension 속도 비교 

def list_comprehension(): 
    result = [ i for i in range(1000)]

def general_list(): 
    result = []
    for i in range(1000): 
        result.append(i) 


%timeit general_list() 
%timeit list_comprehension()

#출력 
# 68 µs ± 1.26 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
# 40.2 µs ± 1.2 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

 

 

d) Enumerate 

- enumerate : 열거하다 

- list의 element를 추출할때 번호와 함께 추출한다. 

- enumerate(string) : string 문자 하나하나를 index + char 로 packing

- enumerate(list) : list의 index + data 를 packing

- dictionary type으로도 가져올 수 있다. 

# Enumerate Ex

for i,v in enumerate(['tic','tac','toe']): 
    print(i,v)

#출력 
0 tic
1 tac
2 toe


for i,v in enumerate('ABC'): # or list type : ['A','B','C']
    print("{0}\t{1}".format(i,v)) # '\t' : tap 
    
#출력
0	A
1	B
2	C
# Enumerate Ex

#list type
my_list = ['a','b','c','d']
list(enumerate(my_list))

#출력
# [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]


# dict type 
my_str = 'ABCD'
{i:v for i,v in enumerate(my_str)}

#출력 
# {0: 'A', 1: 'B', 2: 'C', 3: 'D'}
# Enumerate + List Comprehension 

text = 'Samsung Group is a South Korean Multinational conglomerate headquartered '
[ [i,v] for i,v in enumerate(text.split())]

#출력 
[[0, 'Samsung'],
 [1, 'Group'],
 [2, 'is'],
 [3, 'a'],
 [4, 'South'],
 [5, 'Korean'],
 [6, 'Multinational'],
 [7, 'conglomerate'],
 [8, 'headquartered']]
# Enumerate + Dict type

text = 'Samsung Group is a South Korean Multinational conglomerate headquartered '
{i:v.lower() for i,v in enumerate(text.split())}

#출력
{0: 'samsung',
 1: 'group',
 2: 'is',
 3: 'a',
 4: 'south',
 5: 'korean',
 6: 'multinational',
 7: 'conglomerate',
 8: 'headquartered'}

 

 

e) Zip 

- zip : 묶어주다

- 두 개의 list 값을 병렬적으로 추출한다.

- zip(list1, list2) : list1과 list2 의 같은 위치의 데이터 끼리 묶는다.

# Zip Ex

alist = ['a1','a2','a3']
blist = ['b1','b2','b3']
for a,b in zip(alist,blist): 
    print(a,b)
    
#출력 
a1 b1
a2 b2
a3 b3


a,b,c = zip((1,2,3),(10,20,30),(100,200,300)) #각 튜플의 같은 인덱스끼리 묶음
print(a,b,c)

#출력 
# (1, 10, 100) (2, 20, 200) (3, 30, 300)
# Zip + List Comprehension

[[a,b] for a,b in zip(alist,blist)] 

#출력
# [['a1', 'b1'], ['a2', 'b2'], ['a3', 'b3']]


[sum(x) for x in zip((1,2,3),(10,20,30),(100,200,300))]

#출력
# [111, 222, 333]
# Zip + List Comprehension + Tuple

[(a,b) for a,b in zip(alist,blist)] 

#출력
# [('a1', 'b1'), ('a2', 'b2'), ('a3', 'b3')]


alist = ['a1','a2','a3']
blist = ['b1','b2','b3']

for i, values in enumerate(zip(alist,blist)): 
    print(i,values)
    
#출력
0 ('a1', 'b1')
1 ('a2', 'b2')
2 ('a3', 'b3')

 

 

이상 Pythonic Code Step1 끝! 

Step2에서는 Lambda and MapReduce, Iterator and Generator, Asterisk 에 대해서 정리하려고 한다.

끗!

 

728x90