본문 바로가기

Python/Intermediate

[Python] 고급 - 리스트 및 튜플(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))
print(code_list1)

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

# Comprehending Lists + Map, Filter
# 속도 약간 우세
code_list3 = [ord(s) for s in chars if ord(s) > 40]
print(code_list3)

code_list4 = list(filter(lambda x : x > 40, map(ord, chars)))
print(code_list4)

print(list(map(ord, chars)))

--------------------------------------------[result]

[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]
[43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33, 126, 41]​

# 전체 출력
print(code_list1)
print(code_list2)
print(code_list3)
print(code_list4)
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])

--------------------------------------------[result]

[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]
['+', '_', ')', '(', '*', '&', '^', '%', '$', '#', '@', '!', '~', ')']
['+', '_', ')', '(', '*', '&', '^', '%', '$', '#', '@', '!', '~', ')']
['+', '_', ')', '*', '^', '@', '~', ')']
['+', '_', ')', '*', '^', '@', '~', ')']

 

Generator 생성 및 출력

 

# Generator 생성 , 작은 메모리 조각으로 연속된 데이터를 만들수 있음.
# a = [1,2,3, ..., 100000000] 이렇게 하면 많은 메모리가 필요함.
import array

a = [ord(s) for s in chars]
print('type(a):', type(a))
print('a: ', a)
print()
# Generator : 한 번에 한 개의 항목을 생성(메모리 유지X)
tuple_g = (ord(s) for s in chars) # [] 를 () 변경하면 됨
print('tuple_g: ', tuple_g)
# for i in tuple_g:
#     print(i)

# Array, 수치연산에 최적화 되어 있음, numpy 에서 사용함
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(next(tuple_g))
print(type(array_g))
print('array_g: ', array_g)
print(array_g.tolist())

--------------------------------------------[result]

type(a): <class 'list'>
a:  [43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33, 126, 41]

tuple_g:  <generator object <genexpr> at 0x000001B8EA907BF8>
<class 'generator'>
43
95
<class 'array.array'>
array_g:  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 샘플 코드

 

# 제네레이터 예제
print(('%s' % c + str(n) for c in ['A', 'B', 'C', 'D'] for n in range(1,11)))

print('--------------------------------------------------')
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()

--------------------------------------------[result]

<generator object <genexpr> at 0x000001B8E9EB35C8>
--------------------------------------------------
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

 

# 1-1 Iterable
# iterable 객체 - 반복 가능한 객체
# 대표적으로 iterable한 타입 - list, dict, set, str, bytes, tuple, range
# for in 반복문, Range, enumerate 에서 iterable한 타입을 확인하는 방법이 있습니다.

# 1-2 Iterator
# iterator 객체 - 값을 차례대로 꺼낼 수 있는 객체입니다.
# iterator는 iterable한 객체를 내장함수 또는 iterable객체의 메소드로 객체를 생성할 수 있습니다.

b = {1, 2, 3}
print(type(b))
print('B: ', b)
print()

b_iter = b.__iter__()
print('type(b_iter): ', type(b_iter))
print('b_iter: ', b_iter)
print(next(b_iter))
print()

b = [1, 2, 3]
print(type(b))
print('B: ', b)
print()

b_iter = b.__iter__()
print('type(b_iter): ', type(b_iter))
print('b_iter: ', b_iter)
print(next(b_iter))

--------------------------------------------[result]

<class 'set'>
B:  {1, 2, 3}

type(b_iter):  <class 'set_iterator'>
b_iter:  <set_iterator object at 0x000001B8EA927F78>
1

<class 'list'>
B:  [1, 2, 3]

type(b_iter):  <class 'list_iterator'>
b_iter:  <list_iterator object at 0x000001B8EA923550>
1

 

깊은 복사 & 얕은 복사

 

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

 

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

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

print(marks1)
print(marks2)
print()

# 수정
marks1[0][1] = 'ㅌ '
marks2[0][1] = 'ㅌ '

print(marks1)
print(marks2)
print()

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

--------------------------------------------[result]

[['~', '~', '~'], ['~', '~', '~'], ['~', '~', '~'], ['~', '~', '~']]
[['~', '~', '~'], ['~', '~', '~'], ['~', '~', '~'], ['~', '~', '~']]

[['~', 'ㅌ ', '~'], ['~', '~', '~'], ['~', '~', '~'], ['~', '~', '~']]
[['~', 'ㅌ ', '~'], ['~', 'ㅌ ', '~'], ['~', 'ㅌ ', '~'], ['~', 'ㅌ ', '~']]


[1893721023432, 1893709244488, 1893710125704, 1893710124040]
[1893710125384, 1893710125384, 1893710125384, 1893710125384]

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

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