본문 바로가기
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

     

    반응형

    댓글