반응형

<출처> http://felixblog.tistory.com/54

<출처> http://psychoria.tistory.com/529  (deep copy 참고 부분)

파이썬의 자료 구조

Python 에서는 배열을 기본 자료형으로 사용하지 않고 List, Tuple, Set, Dictionary 네 가지 자료 구조를 기본 자료형으로 사용 합니다.

 

[참고] Java 는 배열(array)를 기본형으로 두고 List, Set 과 같은 자료구조는 util package에서 import 하여 사용 합니다. 배열은 크기가 고정되어 있고 동일한 자료형만을 담을 수 있다는 특징이 있습니다. C, Javascript 언어에서도 기본 자료형은 배열이고, 배열을 활용하여 여러 가지 자료구조를 만들게 됩니다.

List

List 는 여러 가지 자료형을 담을 수 있고, append, remove 등의 메소드를 통해 length 도 조절할 수 있습니다. 역시 쉽네요!

 

myList = ['a','b','c','d','e']
print(myList[0])     # "문자 a" 출력.
print(myList[-2])    # 뒤에서 두번째 요소인 "문자 d" 출력.
print(myList[1:3])   # 리스트 ['b', 'c'] 출력. b는 포함되지만, d 는 포함 안됨.
print(myList[:3])    # 0~2 번째 요소를 출력.
print(myList[-2:])   # 뒤에서 두번째부터 출력.
print(myList[:])     # 전체 출력.

 

Shallow copy, Deep copy

 

myList2 = myList       # Shallow copy(주소값만 복사)
myList2 = myList[:]    # Shallow copy(내용 전체 복사)
myList2 = copy(myList) # Shallow copy(내용 전체 복사)

 

재귀적으로 내부 내용을 복사하는 deepcopy() 함수는 따로 제공 됩니다.

 

[참고] list 안의 list는 정상적인 깊은 복사가 안 되는 문제가 발생

그래서 파이썬의 copy에는 deepcopy()라는 메소드가 지원됩니다.

deepcopy를 사용하기 위해서는 copy 라이브러리를 먼저 import하고 사용할 수 있습니다.

 
 
 
 
 
 
 
 
 
 
import copy
myList1 = [1, 2, [3, 4], 5]
myList2 = copy.deepcopy(myList1)
print(hex(id(myList1)))
print(hex(id(myList2)))
print(hex(id(myList1[2])))
print(hex(id(myList2[2])))

이렇게 deepcopy()를 사용해서 파이썬의 깊은 복사를 사용할 수 있습니다.

--------------------------------------------------------------------------------------------------

 

 

List 함수에는 append, extend, sort, reverse, index, remove, pop, count 등이 있습니다.

 

특정 값이 있는지 조사할 때는 in 을 사용 합니다.

 

myList = ['a','b','c','d','e']
print('d' in myList)   # True
print('z' in myList)   # False

 

append VS extend  //  del VS remove

 

myList = ['a','b','c']
myList2 = myList[:]
myList2.append(['x','y'])  # ['a','b','c',['x','y']]. 마지막 요소 자리에 리스트가 들어간다.
print(myList2)
myList2 = myList[:]
myList2.extend(['x','y'])  # ['a','b','c','x','y']. 리스트가 확장된다.
print(myList2)
myList2 = myList[:]
del myList2[0]      # index 가 0 인 'a' 를 삭제.
print(myList2)
myList2.remove(0)  # '0' 을 찾아서 삭제. 여기서는 0이 없으므로 ValueError 발생.

 

조건식을 사용하여 새로운 리스트를 만들 수도 있습니다.

 

myList = [1,2,3,4,5]
myList2 = [i*2 for i in myList if i>3]
print(myList)      # [1,2,3,4,5]
print(myList2)    # [8, 10]

 

내장함수 filter, map, zip 을 이용하여 새로운 리스트를 만들 수도 있습니다.

 

myList = [1,2,3,4,5]
print(myList)      # [1,2,3,4,5]
def f(i):
     if(i<4) : return True
     else : return False
myList2 = list(filter(f, myList))   # 전달된 함수 f 로 myList 를 필터링한다.
print(myList2)   # [1,2,3]
def g(i):
     if(i<3) : return i*10
     else : return i
myList3 = list(map(g, myList))   # 전달된 함수 g 로 myList2 를 매핑한다.
print(myList3)   # [10,20,3,4,5]
myList4 = list(zip(myList, myList2, myList3))   # 3개의 lists 를 Tuple 로 묶는다.
print(myList4)   # [ (1,1,10) , (2,2,20) , (3,3,3) ]

Tuple

Tuple은 List 와 달리 [] 가 아닌 () 로 둘러싸서 표현 합니다. 활용 방법이나 함수는 List 와 유사하나, 값을 변경할 수 없습니다.

Set

집합은 {} 로 둘러싸서 표현 합니다. 집합은 중복된 요소를 허락하지 않고, 임의의 순서를 가집니다.

 

mySet = {'a', 'b', 'c', 'a'}
print(mySet)
### 문자열을 List, Tuple, Set 자료형으로 만들기 ###
mySet = list('abca')
print(mySet)          # ['a', 'b', 'c', 'a'] 출력
mySet = tuple('abca')
print(mySet)          # ('a', 'b', 'c', 'a') 출력
mySet = set('abca')
print(mySet)          # {'a', 'c', 'b'} 출력(순서는 그때그때 달라짐)

 

빈 집합을 만들 때에는 {} 가 아니라 set() 라고 선언해 줘야 합니다. {} 는 dictionary 자료구조를 만듭니다.

Dictionary

Hashtable 입니다. 집합과 같이 {} 로 둘러싸서 표현하나, {key1:value1, key1:value1, ...} 형태로 각 요소가 '키:값' 쌍을 이루고 있습니다. 집합과 마찬가지로 임의의 순서를 가집니다.

 

Dictionary 함수에는 keys, values, items, clear, get, in 등이 있습니다.

 

아래에서는 함수를 순환하면서 k(key) 와 v(value) 를 출력 합니다. k, v 변수명은 바꿔도 상관 없습니다. items() 함수를 사용했음을 기억해 두세요. 집합과 같이, k,v 의 출력 순서가 임의로 결정되는 것을 볼 수 있습니다.

 

myDic = {'name':'철수', 'age':24, 'grade':'빵점!'}
for k,v in myDic.items():
     print(k,v)


<이상>

 

반응형

+ Recent posts