본문 바로가기
Study/Python

[기초문법] Iterable 과 Conatainer(리스트,튜블,집합,딕셔너리)

by 까망우동 2023. 2. 23.
반응형

 

Index

Iterator, Container ⊂ Iterable

Iterable, Iterator, Conatiner 객체간에 어떠한 차이가 있는지, 정확하게 이해해보고 구분해보자. 

Conatiner 에 해당하는 다양한 객체 (list,tuple,str,set,dict 등) 들의 차이점과 특징에 대해 이해해보자. 

 

# Iterable 객체란?

  • 한 번에 하나의 값을 반환할 수 있는, 반복가능한 object(객체)
  • list,dict,tuple 과 같은 Container 도 Iterable 의 종류 중 하나이다
  • 자체적으로 __iter__ 메소드를 가지고 있어, iter()로 전달될 때 Iterator 객체를 생성한다. 
  • for문을 통해 반복할 수 있으면 Iterable 이다. 

Iterable
Iterable, Iterator, Container 간의 하이어라키


# Iterator 객체란?

  • 순서대로 다음값을 꺼낼 수 있는 객체
  • 자체적으로 __next__ 메소드를 가지고 있어, 이를통해 다음 값을 가져올 수 있음

※ __next__ 메소드로 다음 값을 반환할 수 있으면 Iterator, 없으면 Iterable 객체로 iter()를 통해 iterator 로 만들 수 있음

 

a = [1,2,3]
print(a, type(a))  # a 는 list 이고, iterable 이다. 
a = iter(a)
print(a, type(a))  # a 는 iter를 통해 list_iterator 가 되었다. 
print(a.__next__())  # iterator 이기때문에 next 메서드 실행가능, 1출력
print(next(a)) # 다음과 같은 방식으로도 출력가능, 2출력
print(a.__next__()) # 3출력
print(a.__next__()) # StopIteration 출력

map 함수는 iterator 이기때문에 next 메서드 사용이 가능하다. 

a = [1,2,3]
m = map(int,a)
print(m.__next__())

iterator 타입은 한번 item 을 꺼내쓰고 나면 item 이 소진된다. 

t = map(int, [1,2,3,4,5])
print(sum(t)) # 15
print(sum(t)) # 0 소진됨

# Containter 

  • list, set, dictionary, str 과 같이 개별 item 을 저장하는 저장소 역할 
  • str,tuple, list 는 index로 접근하고 , dict 는 key값으로 접근, set 는 개별접근 불가능 (순서가 없기때문)
  • iterable 타입은 모두 Unpack 이 가능하다. iterable 변수에  *붙여서 함수에 전달하면 item 들이 모두 unpack되어나옴
t1,t2,t3 = (1,2,3)
s1,s2,s3 = {1,2,3} #단, set 의 경우 저장되는 순서는 알 수 없다. 

# dict 의 경우 unpack 의 대상을 지정해줘야한다. 
k1,k2,k3 = {'a':1, 'b':2, 'c':3}.keys()
v1,v2,v3 = {'a':1, 'b':2, 'c':3}.values()
i1,i2,i3 = {'a':1, 'b':2, 'c':3}.items()
print(t1,s1,k1,v1,i1)

#부분 언팩도 가능함
t = (1,2,3,4,5,6,7)
a,b,*c,d,e = t
print(a,b,c,d,e) #결과 : 1,2,[3,4,5],6,7
print(*t) #결과 : 1 2 3 4 5 6 7
  • Iterable 안에 Item 존재 여부를 판단하는 연산
t = ([1,2,3,1],{1,2},(1,2,3))
print(1 in t, {1,2} in t, (1,2,3) not in t)

몇가지 주요한 Container 에 대해서 알아보자 !!

## 리스트 [ list]

  • 순서가 있고, 중복이 가능하고, 수정/삭제/추가가 가능함 (mutable 하다) 
  • 리스트 내 삽입/수정/정렬 등 여러가지 기능들에 대한 예시  
mylist = ['song','ryu','lee',10,20,30]
mylist.append('10') # 추가하기
mylist.insert(3,'park') # 특정위치에 삽입하기 
mylist.pop() # 뒤에서부터 하나 빼기 

print(mylist.index('park')) # 리스트 내 위치찾기 
print(mylist.count(10)) 

mylist2 = [3,1,2,5,6,2,4]
mylist2.sort() # 오름차순 정렬
mylist2.reverse() # 내림차순 정렬
mylist2.clear() # 초기화 (아이템 모두 삭제)

mylist.extend(mylist2) # 리스트 확장 (연결)

## 튜플 (tuple)

  • 리스트처럼 순서도 있고 중복도 가능함, 다만 수정/삭제/추가가 안됨 (immutable 하다) 
  • 속도가 빠르고 binary 로 저장된다.

※ Slicing  

Sequence type (tuple,str,list 등) 에서는 slicing 연산을 사용 할 수 있다. 

Sequence[start: stop: step] 으로 사용한다. 

# slicing a list
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(my_list[1:7:2]) # prints [2, 4, 6, 8]

# using negative indices to slice
my_tuple = (1, 2, 3, 4, 5)
print(my_tuple[-3:]) # prints (3, 4, 5)

# stepping backwards to reverse a sequence
my_list = [1, 2, 3, 4, 5]
print(my_list[::-1]) # prints [5, 4, 3, 2, 1]

# Slicing 은 아니지만.. Sequence 에서 특정 항목 제거하려면
del s[m]
del s[m:n:k]
del s[:] = s.clear()

 

 

## 집합 {set} 

  • 순서도 없고, 중복도 없다. 수정/삭제/추가가 가능함 (mutable 하다) 
  • 집합의 삽입/수정/정렬 등 여러가지 기능들에 대한 예시 
myset = {'song','kim','lee'}
myset.add("park") #item 추가 
myset.remove('song') #item 삭제

myset2 = {'kim','lee','hwang','sung'}

print(myset&myset2) # 교집합
print(myset.intersection(myset2))

print(myset|myset2) #합집합
print(myset.union(myset2))

print(myset2-myset) #차집합
print(myset2.difference(myset))

## 딕셔너리  {key:value}

  • Key:Value 값으로 구성되어있음. 수정/삭제/추가가 가능함 (mutable 하다) 
  • 딕셔너리의 삽입/수정/정렬 등 여러가지 기능들에 대한 예시
# dict 를 정의하는 두가지 방식. 후자는 key에 '' 안써도되서 편함
mydict = {'name':'Song', 'Age':29, 'color':('red','black')}
mydict2 = dict( name='Song', Age=29, color=('red','black'))

print(mydict['name'])
print(mydict.get('name')) # [key] 와의 차이는, get을 쓰면 없는 key 반환요청 시 None 반환
print(mydict.get('address', '빈주소')) # 없는 key를 반환요청할때 None 대신 if error 역할 

print('name' in mydict) # key 여부 확인

mydict['address'] = {'강남,분당,구미'} # key 추가/수정
del mydict['Age'] # 삭제 
 
# key, value 출력 방식
print(mydict.keys(), mydict.values(), mydict.items())

딕셔너리 for 문에서 .item 활용방법 

for key,value in mydict.items():
    print(key,str(value), sep=" :")

 

  • JSON 과 딕셔너리 의 변환 (둘다 Key:Value 형식으로 서로 변환이 가능함) 

 

## range 함수 

  • range 는 container 는 아니다. 규칙적인 연속값 만들떄는 tuple, list 보다 메모리 절감측면에서 유리하다. 
  • range(start,stop,step) 으로 input값이 구성되어있음
a = range(0,10,2)
print(a) # 결과값 : range(0, 10, 2)
print(*a) # 결과값 : 0 2 4 6 8

 

반응형

댓글