Python/Syntax

파이썬 컬렉션 관리

Caniro 2021. 8. 24. 10:42

컬렉션 관리

컬렉션 관리 함수

enumerate

  • 시퀀스의 인덱스와 요소를 튜플로 묶어서 순회한다.

    enumerate(시퀀스 [, start])
    race = ['저그', '테란', '프로토스']
    print(list(enumerate(race)))
    
    ''' stdout
    [(0, '저그'), (1, '테란'), (2, '프로토스')]
    '''
  • 시작 숫자를 정할 수 있다.

    score = [88, 95, 70, 100, 99]
    
    for no, s in enumerate(score, 1):
        print(f"{no}번 학생의 성적 : {s}")
    
    ''' stdout
    1번 학생의 성적 : 88
    2번 학생의 성적 : 95
    3번 학생의 성적 : 70
    4번 학생의 성적 : 100
    5번 학생의 성적 : 99
    '''
  • 언팩해서 쓰면 좋다.

zip

  • 시퀀스 두 개를 순서대로 튜플로 묶어서 zip 객체로 반환한다.

    • 길이가 다를 경우 짧은 길이에 맞춘다.
  • 예시

    dates = ["월", "화", "수", "목", "금", "토", "일"]
    food = ["갈비탕", "순대국", "칼국수", "삼겸살"]
    menu = zip(dates, food)
    for d, f in menu:
        print(f"{d}요일 메뉴 : {f}")
    
    ''' stdout
    월요일 메뉴 : 갈비탕
    화요일 메뉴 : 순대국
    수요일 메뉴 : 칼국수
    목요일 메뉴 : 삼겸살
    '''
  • list(집객체) 등으로 한번 순회하고 나면 데이터가 사라진다.

    • zip 객체는 제너레이터 함수로 구성되어 있기 때문이다.

any, all

  • any(시퀀스)

    • 시퀀스에 하나라도 True가 있으면 True 반환
  • all(시퀀스)

    • 시퀀스의 모든 요소가 True이면 True 반환
  • 예시

    adult = [True, False, True, False]
    print(any(adult))
    print(all(adult))
    
    ''' stdout
    True
    False
    '''

람다 함수

filter

  • 시퀀스의 각 요소를 판정함수에 전달하여 True를 리턴하는 요소로만 구성된 새로운 시퀀스를 리턴한다.

    filter(판정함수, 시퀀스) -> 시퀀스 # "->"는 반환 자료형을 의미한다.

map

  • 시퀀스를 변환함수에 전달하여 map 객체를 리턴한다.

    map(변환함수, 시퀀스[, 시퀀스])
  • 여러 시퀀스를 넣을 수 있다. 이 때 함수의 인수 개수와 일치해야 한다.

    def add(s, b):
        return s + b
    
    score = [45, 89, 72, 53, 94]
    bonus = [2, 3, 0, 0, 5]
    
    for s in map(add, score, bonus):
        print(s, end = ", ")
    
    ''' stdout
    47, 92, 72, 53, 99,
    '''

람다 함수

  • 이름이 없는 한 줄짜리 함수이다.

    lambda 인수: 식
  • 예시

    score = [ 45, 89, 72, 53, 94 ]
    
    for s in filter(lambda x: x < 60, score):
        print(s)
    
    ''' stdout
    45
    53
    '''
  • 파이썬은 들여쓰기로 줄을 구분하기 때문에, 한 줄밖에 쓰지 못한다.


컬렉션의 사본

시퀀스의 사본

  • 원시타입이 아닌 자료형은 기본적으로 대입할 때 Call by Reference이므로 같은 객체이다.

  • 새로운 객체를 만들려면 copy 메서드를 사용해야 한다.

    시퀀스.copy()
    list1 = [1, 2, 3]
    list2 = list1.copy() # list2 = list1[:]와 동일
    print(list1 == list2)
    list2[1] = 100
    print(list1)
    print(list2)
    print(list1 == list2)
    
    ''' stdout
    True
    [1, 2, 3]
    [1, 100, 3]
    False
    '''
  • Deep Copy를 하기 위해서는 deepcopy 메서드를 사용한다.

    import copy
    list0 = ['a', 'b']
    list1 = [list0, 1, 2]
    list2 = copy.deepcopy(list1) # 깊은 복사
    list2[0][1] = 'c'
    print(list1)
    print(list2)
    
    ''' stdout
    [['a', 'b'], 1, 2]
    [['a', 'c'], 1, 2]
    '''

is 연산자

  • 두 변수가 같은 객체를 가리키는지 조사할 수 있다.

    list1 = ['a', 'b']
    list2 = list1
    list3 = list1.copy() # 얕은 복사
    print("list1 is list2 :", list1 is list2)
    print("list1 is list3 :", list1 is list3)
    print("list2 is list3 :", list2 is list3)
    
    ''' stdout
    list1 is list2 : True
    list1 is list3 : False
    list2 is list3 : False
    '''