본문 바로가기

Python/Intermediate

[Python] 고급 - 리스트 및 튜플(1) - Sequence(1)

  • 컨테이너 타입 자료형(Container : 서로다른 자료형[list, tuple, collections.deque], 

a = [3, 3.5, 'a'] # 서로 다른 자료형, 컨네이너 타입 자료형

 

  • Flat : 한 개의 자료형[str, bytes, bytearray, array.array, memoryview])

한개의 자료형만 저장, 빠름, 자연어 처리, 숫자, 이산, 회계분석, 기상데이터 등 단일 형태의 연산

 

  • 가변(list, bytearray, array.array, memoryview, deque)
  • 불변(tuple, str, bytes)

 

# 지능형 리스트(Comprehending Lists)

# Non Comprehending Lists
chars = '+_)(*&^%$#@!~)'
code_list1 = []

for s in chars:
    # 유니코드 리스트
    code_list1.append(ord(s))

# Comprehending Lists
code_list2 = [ord(s) for s in chars]

# Comprehending Lists + Map, Filter 조건을 추가해서 필터링 가능
# 속도 약간 우세
code_list3 = [ord(s) for s in chars if ord(s) > 40]
code_list4 = list(filter(lambda x : x > 40, map(ord, chars)))

# 전체 출력
print(code_list1)
print(code_list2)
print(code_list3)
print(code_list4)
# [43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33, 126, 41]
# [43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33, 126, 41]
# [43, 95, 41, 42, 94, 64, 126, 41]
# [43, 95, 41, 42, 94, 64, 126, 41]

print([chr(s) for s in code_list1])
print([chr(s) for s in code_list2])
print([chr(s) for s in code_list3])
print([chr(s) for s in code_list4])
# ['+', '_', ')', '(', '*', '&', '^', '%', '$', '#', '@', '!', '~', ')']
# ['+', '_', ')', '(', '*', '&', '^', '%', '$', '#', '@', '!', '~', ')']
# ['+', '_', ')', '*', '^', '@', '~', ')']
# ['+', '_', ')', '*', '^', '@', '~', ')']

 

Generator 생성 및 출력

 

# Generator 생성
import array

a = [ord(s) for s in chars]
print('type(a):', type(a))
print('a: ', a)
# type(a): <class 'list'>
# a:  [43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33, 126, 41]

# Generator : 한 번에 한 개의 항목을 생성(메모리 유지X)
tuple_g = (ord(s) for s in chars)
# Array
array_g = array.array('I',  (ord(s) for s in chars)) # 데이터 타입을 정수로 선언.

print(type(tuple_g))
#print(tuple_g.tolist()) # gnerator 은 tolist() 없음
print(next(tuple_g))
print(type(array_g))
print(array_g)
print(array_g.tolist())
# <class 'generator'>
# 43
# <class 'array.array'>
# array('I', [43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33, 126, 41])
# [43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33, 126, 41]

 

Generator 샘플 코드

 

# 제네레이터 예제
# test = (chr(s) for s in code_list2)

# 리스트로 구현한 경우
print([t for t in (chr(s) for s in code_list2)])
# ['+', '_', ')', '(', '*', '&', '^', '%', '$', '#', '@', '!', '~', ')']

# generator
print(('%s' % (chr(s) for s in code_list2)))
# <generator object <genexpr> at 0x7f946008cf90>

print(('%s' % c + str(n) for c in ['A', 'B', 'C', 'D'] for n in range(1,11)))
# <generator object <genexpr> at 0x7f946008cf90>

for s in ('%s' % c + str(n) for c in ['A', 'B', 'C', 'D'] for n in range(1,4)):
    print(s, end=', ')
# A1, A2, A3, B1, B2, B3, C1, C2, C3, D1, D2, D3, %


for s in ('%s' %c +'-'+ str(n).zfill(2) for c in ['A', 'B', 'C', 'D'] for n in range(1,6)):
    print(s, end='  ')
    if (s[2:4]=='05'):
        print()
# A-01  A-02  A-03  A-04  A-05  
# B-01  B-02  B-03  B-04  B-05  
# C-01  C-02  C-03  C-04  C-05  
# D-01  D-02  D-03  D-04  D-05

 

Iterable & Iterator

 

참고할 사이트 : https://wikidocs.net/16068

 

b = {1, 2, 3}
print('type(b): ', type(b))
print('B: ', b)
# type(b):  <class 'set'>
# B:  {1, 2, 3}


# set_iterator
b_iter = b.__iter__()
print('type(b_iter): ', type(b_iter))
print('b_iter: ', b_iter)
print(next(b_iter))
print(next(b_iter))
print(next(b_iter))
# print(next(b_iter)) # 4번째 인자가 없어서 오류 발생
# type(b_iter):  <class 'set_iterator'>
# b_iter:  <set_iterator object at 0x7fea100d4340>
# 1
# 2
# 3
# Traceback (most recent call last):
#   File "/Users/mike/StudioProjects/python/Inflearn-inter/강의+자료/예제 소스 파일/p_chapter04_01.py", line 151, in <module>
#     print(next(b_iter))
# StopIteration


b = [1, 2, 3]
print('type(b): ', type(b))
print('B: ', b)
# type(b):  <class 'list'>
# B:  [1, 2, 3]


# list_iterator
b_iter = b.__iter__()
print('type(b_iter): ', type(b_iter))
print('b_iter: ', b_iter)
print(next(b_iter))
# type(b_iter):  <class 'list_iterator'>
# b_iter:  <list_iterator object at 0x7fb2f808fe20>
# 1

 

깊은 복사 & 얕은 복사

 

참고할 사이트 : https://wikidocs.net/16038

 

# 리스트 주의, 깊은 복사 얕은 복사 리스트 주의, 깊은 복사 얕은 복사
# mutable - shallow copy 주의할 것.

# 깊은 복사
marks1 = [['~'] * 3 for n in range(3)]
# 얕은 복사
marks2 = [['~'] * 3] * 3

print(marks1)
print(marks2)
# [['~', '~', '~'], ['~', '~', '~'], ['~', '~', '~']]
# [['~', '~', '~'], ['~', '~', '~'], ['~', '~', '~']]


# 수정
marks1[0][1] = 'X' # 깊은 복사
marks2[0][1] = 'X'

print(marks1)
print(marks2)
# [['~', 'X', '~'], ['~', '~', '~'], ['~', '~', '~']]
# [['~', 'X', '~'], ['~', 'X', '~'], ['~', 'X', '~']]

# 증명, 깊은복사인지 얕은복사인지 확인시 id() 로 확인할 것
print([id(i) for i in marks1]) # 깊은 복사
print([id(i) for i in marks2])
# [140478314542848, 140478314542656, 140478314542592]
# [140478314542400, 140478314542400, 140478314542400]

 

 

 

 

 

'Python > Intermediate' 카테고리의 다른 글

[Python] 고급 - Dict 및 Set(1)  (0) 2021.05.23
[Python] 고급 - 리스트 및 튜플(2) - Sequence(2)  (0) 2021.05.23
[Python] NamedTuple - Magic Method(3)  (0) 2021.05.21
[Python] Magic Method(2)  (0) 2021.05.21
[Python] Magic Method(1)  (0) 2021.05.21