Python collections 모듈 사용 방법

12981 단어 Python컬렉션 모듈
컬렉션 모듈
이 모듈은 파이썬 표준 내장 용기dict,list,set,tuple의 대체 선택을 제공하기 위해 특정 목표의 용기를 실현했다.
  • Counter: 사전의 하위 클래스로 해시 대상의 계수 기능을 제공합니다
  • defaultdict: 사전의 하위 클래스로 공장 함수를 제공하여 사전 조회에 기본값을 제공합니다
  • Ordered Dict: 사전의 하위 클래스는 그들이 추가된 순서를 보존합니다
  • namedtuple: 그룹 하위 클래스를 만드는 공장 함수입니다
  • deque: 목록 용기와 유사하게 양쪽 끝에 빠른 추가(append)와 팝업(pop)을 실현합니다
  • ChainMap: 사전과 유사한 용기류로 여러 개의 맵을 한 보기에 집합합니다
  • Counter
    Counter는dict 하위 클래스입니다. 주로 방문한 대상의 빈도를 계산하는 데 사용됩니다.
    
    >>> import collections
    >>> #  
    ... collections.Counter('hello world')
    Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
    >>> #  
    ... collections.Counter('hello world hello lucy'.split())
    Counter({'hello': 2, 'world': 1, 'lucy': 1})
    일반적인 방법:
  • elements(): 하나의 교체기를 되돌려줍니다. 원소마다 반복적으로 계산된 개수입니다. 원소의 계수가 1보다 작으면 무시됩니다
  • most_common([n]): 목록을 되돌려주고 n개의 접근 빈도가 가장 높은 요소와 계수를 제공합니다
  • subtract([iterable-or-mapping]): 교체 대상에서 원소를 빼고 입력과 출력은 0 또는 음수일 수 있습니다
  • update([iterable-or-mapping]): 교체 대상 계수 요소 또는 다른 맵 대상(또는 계수기)에서 추가합니다
  • 
    >>> c = collections.Counter('hello world hello lucy'.split())
    >>> c
    Counter({'hello': 2, 'world': 1, 'lucy': 1})
    >>> #  , get 
    ... c['hello']
    2
    >>> #  
    ... list(c.elements())
    ['hello', 'hello', 'world', 'lucy']
    >>> c1 = collections.Counter('hello world'.split())
    >>> c2 = collections.Counter('hello lucy'.split())
    >>> c1
    Counter({'hello': 1, 'world': 1})
    >>> c2
    Counter({'hello': 1, 'lucy': 1})
    >>> #  ,+ c1.update(c2)
    ... c1+c2
    Counter({'hello': 2, 'world': 1, 'lucy': 1})
    >>> #  ,- c1.subtract(c2)
    ... c1-c2
    Counter({'world': 1})
    >>> #  
    ... c.clear()
    >>> c
    Counter()
    
    defaultdict
    새로운 유사한 사전의 대상을 되돌려줍니다.defaultdict는 내장된dict류의 하위 클래스입니다.
    
    class collections.defaultdict([default_factory[, ...]])
    >>> d = collections.defaultdict()
    >>> d
    defaultdict(None, {})
    >>> e = collections.defaultdict(str)
    >>> e
    defaultdict(<class 'str'>, {})
    
    예제
    defaultdict의 전형적인 사용법은 그 중의 내장 형식 (예를 들어str, int,list,dict 등) 을 기본 공장으로 사용하는 것입니다. 이 내장 형식들은 매개 변수가 호출되지 않을 때 빈 형식으로 되돌아옵니다.
    
    >>> e = collections.defaultdict(str)
    >>> e
    defaultdict(<class 'str'>, {})
    >>> e['hello']
    ''
    >>> e
    defaultdict(<class 'str'>, {'hello': ''})
    >>> #  , 
    ... e1 = {}
    >>> e1['hello']
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
    KeyError: 'hello'
    
    int를 default_로 사용factory
    
    >>> fruit = collections.defaultdict(int)
    >>> fruit['apple'] = 2
    >>> fruit
    defaultdict(<class 'int'>, {'apple': 2})
    >>> fruit['banana'] #  , 0
    0
    >>> fruit
    defaultdict(<class 'int'>, {'apple': 2, 'banana': 0})
    default_로 list 사용하기factory
    
    >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
    >>> d = collections.defaultdict(list)
    >>> for k,v in s:
    ...   d[k].append(v)
    ...
    >>> d
    defaultdict(<class 'list'>, {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]})
    >>> d.items()
    dict_items([('yellow', [1, 3]), ('blue', [2, 4]), ('red', [1])])
    >>> sorted(d.items())
    [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
    
    dict를 default_로 사용factory
    
    >>> nums = collections.defaultdict(dict)
    >>> nums[1] = {'one':1}
    >>> nums
    defaultdict(<class 'dict'>, {1: {'one': 1}})
    >>> nums[2]
    {}
    >>> nums
    defaultdict(<class 'dict'>, {1: {'one': 1}, 2: {}})
    
    set을 default_로 사용factory
    
    >>> types = collections.defaultdict(set)
    >>> types[' '].add(' ')
    >>> types[' '].add(' ')
    >>> types[' '].add('AOC')
    >>> types
    defaultdict(<class 'set'>, {' ': {' ', ' '}, ' ': {'AOC'}})
    
     OrderedDict
    Python 사전의 키 순서는 임의로 추가된 순서에 의해 제어되지 않습니다.
    
    collections.OrderedDict  
    >>> o = collections.OrderedDict()
    >>> o['k1'] = 'v1'
    >>> o['k3'] = 'v3'
    >>> o['k2'] = 'v2'
    >>> o
    OrderedDict([('k1', 'v1'), ('k3', 'v3'), ('k2', 'v2')])
    
    이미 존재하는 키에 새 값을 추가하면 원래의 키의 위치를 보존하고value 값을 덮어씁니다.
    
    >>> o['k1'] = 666
    >>> o
    OrderedDict([('k1', 666), ('k3', 'v3'), ('k2', 'v2')])
    >>> dict(o)
    {'k1': 666, 'k3': 'v3', 'k2': 'v2'}
    namedtuple
    세 가지 명명 메타그룹을 정의하는 방법: 첫 번째 매개 변수는 명명 메타그룹을 만드는 구조기입니다(아래: Person1, Person2, Person3)
    
    >>> P1 = collections.namedtuple('Person1',['name','age','height'])
    >>> P2 = collections.namedtuple('Person2','name,age,height')
    >>> P3 = collections.namedtuple('Person3','name age height')
    
    인스턴스 명명 메타그룹
    
    >>> lucy = P1('lucy',23,180)
    >>> lucy
    Person1(name='lucy', age=23, height=180)
    >>> jack = P2('jack',20,190)
    >>> jack
    Person2(name='jack', age=20, height=190)
    >>> lucy.name #    .   
    'lucy'
    >>> lucy.age
    23
    deque
    collections.deque는 왼쪽에서 오른쪽으로 초기화 (방법 append (), iterable (교체 대상) 데이터에서 새 양방향 대기열 대상을 되돌려줍니다.iterable이 지정되지 않으면 새 대기열이 비어 있습니다.
    collections.deque 대기열은 스레드 보안을 지원합니다. 양쪽에서 (append) 또는 팝업 (pop) 을 추가하는 데 복잡도 O (1) 입니다.
    list 대상도 유사한 조작을 지원하지만, 여기는 정장 조작(pop(0), insert(0, v)의 비용을 최적화시켰다.
    maxlen이 지정되지 않거나 None이면 deque는 임의의 길이로 성장할 수 있습니다.그렇지 않으면, deque는 지정한 최대 길이로 제한됩니다.한정된 길이의 deque가 가득 차면, 새 항목이 가입할 때, 같은 수량의 항목이 다른 쪽에서 팝업됩니다.
    지원되는 방법:
  • append(x): 오른쪽에 x를 추가합니다
  • appendleft(x): 왼쪽에 x를 추가합니다
  • clear(): 모든 요소를 제거하고 길이가 0으로 변경됩니다
  • copy(): 간단한 복사본을 만듭니다
  • count(x): 대기열의 개수가 x와 같은 원소를 계산합니다
  • extend(iterable): 대기열 오른쪽에iterable의 요소를 추가합니다
  • extendleft(iterable): 대기열 왼쪽에iterable의 요소를 추가합니다. 주: 왼쪽에 추가할 때iterable 매개 변수의 순서는 반대로 추가됩니다
  • index(x[,start[,stop]]): 첫 번째 요소를 되돌려줍니다(start부터 계산하고 stop 전에).첫 번째 일치로 돌아가서 찾을 수 없으면 ValueError를 올리십시오..
  • insert(i,x): 위치 i에 x를 삽입합니다.주: 만약 삽입이 길이 제한 deque가 길이 maxlen을 초과할 수 있다면, IndexError..
  • pop(): 맨 오른쪽에 있는 요소를 제거합니다
  • popleft(): 맨 왼쪽에 있는 요소를 제거합니다
  • remove(value): 찾은 첫 번째 value로 이동합니다.ValueError가 없습니다
  • reverse (): deque 역순으로 배열합니다.None으로 돌아가기..
  • maxlen: 대기열의 최대 길이, 제한이 없으면 None..
  • 
    >>> d = collections.deque(maxlen=10)
    >>> d
    deque([], maxlen=10)
    >>> d.extend('python')
    >>> [i.upper() for i in d]
    ['P', 'Y', 'T', 'H', 'O', 'N']
    >>> d.append('e')
    >>> d.appendleft('f')
    >>> d.appendleft('g')
    >>> d.appendleft('h')
    >>> d
    deque(['h', 'g', 'f', 'p', 'y', 't', 'h', 'o', 'n', 'e'], maxlen=10)
    >>> d.appendleft('i')
    >>> d
    deque(['i', 'h', 'g', 'f', 'p', 'y', 't', 'h', 'o', 'n'], maxlen=10)
    >>> d.append('m')
    >>> d
    deque(['h', 'g', 'f', 'p', 'y', 't', 'h', 'o', 'n', 'm'], maxlen=10)
    ChainMap
    문제의 배경은 우리가 여러 개의 사전이나 맵을 가지고 있기 때문에 그것들을 하나의 단독 맵으로 통합시키려고 한다. 어떤 사람들은 업데이트로 합병할 수 있다고 말한다. 이렇게 하는 문제는 데이터 구조를 새로 만들어서 우리가 원래의 사전을 변경할 때 동일하지 않게 하는 것이다.동기화 조회 방법을 만들려면 ChainMap 을 사용하십시오.
    두 개 이상의 사전을 합쳐서 조회할 때 뒤로 가서 순서대로 조회할 수 있다.간단한 사용:
    
    >>> d1 = {'apple':1,'banana':2}
    >>> d2 = {'orange':2,'apple':3,'pike':1}
    >>> combined1 = collections.ChainMap(d1,d2)
    >>> combined2 = collections.ChainMap(d2,d1)
    >>> combined1
    ChainMap({'apple': 1, 'banana': 2}, {'orange': 2, 'apple': 3, 'pike': 1})
    >>> combined2
    ChainMap({'orange': 2, 'apple': 3, 'pike': 1}, {'apple': 1, 'banana': 2})
    >>> for k,v in combined1.items():
    ...   print(k,v)
    ...
    orange 2
    apple 1
    pike 1
    banana 2
    >>> for k,v in combined2.items():
    ...   print(k,v)
    ...
    apple 3
    banana 2
    orange 2
    pike 1
    
    한 가지 주의점은 ChainMap을 수정할 때 항상 첫 번째 사전만 수정하고, 첫 번째 사전이 이 키가 없으면 추가한다는 것이다.
    
    >>> d1 = {'apple':1,'banana':2}
    >>> d2 = {'orange':2,'apple':3,'pike':1}
    >>> c = collections.ChainMap(d1,d2)
    >>> c
    ChainMap({'apple': 1, 'banana': 2}, {'orange': 2, 'apple': 3, 'pike': 1})
    >>> c['apple']
    1
    >>> c['apple'] = 2
    >>> c
    ChainMap({'apple': 2, 'banana': 2}, {'orange': 2, 'apple': 3, 'pike': 1})
    >>> c['pike']
    1
    >>> c['pike'] = 3
    >>> c
    ChainMap({'apple': 2, 'banana': 2, 'pike': 3}, {'orange': 2, 'apple': 3, 'pike': 1})
    
    원리적으로 말하자면 ChainMap은 실제로 넣은 사전을 하나의 대기열에 저장하고 사전의 추가 삭제 등 조작은 첫 번째 사전에서만 진행되며 검색할 때 순서대로 찾아낸다.new_child () 방법은 실질적으로 목록의 첫 번째 요소 앞에 사전을 넣는 것입니다. 기본값은 {}이고,parents는 목록의 시작 요소를 제거합니다.
    
    >>> a = collections.ChainMap()
    >>> a['x'] = 1
    >>> a
    ChainMap({'x': 1})
    >>> b = a.new_child()
    >>> b
    ChainMap({}, {'x': 1})
    >>> b['x'] = 2
    >>> b
    ChainMap({'x': 2}, {'x': 1})
    >>> b['y'] = 3
    >>> b
    ChainMap({'x': 2, 'y': 3}, {'x': 1})
    >>> a
    ChainMap({'x': 1})
    >>> c = a.new_child()
    >>> c
    ChainMap({}, {'x': 1})
    >>> c['x'] = 1
    >>> c['y'] = 1
    >>> c
    ChainMap({'x': 1, 'y': 1}, {'x': 1})
    >>> d = c.parents
    >>> d
    ChainMap({'x': 1})
    >>> d is a
    False
    >>> d == a
    True
    
    
    >>> a = {'x':1,'z':3}
    >>> b = {'y':2,'z':4}
    >>> c = collections.ChainMap(a,b)
    >>> c
    ChainMap({'x': 1, 'z': 3}, {'y': 2, 'z': 4})
    >>> c.maps
    [{'x': 1, 'z': 3}, {'y': 2, 'z': 4}]
    >>> c.parents
    ChainMap({'y': 2, 'z': 4})
    >>> c.parents.maps
    [{'y': 2, 'z': 4}]
    >>> c.parents.parents
    ChainMap({})
    >>> c.parents.parents.parents
    ChainMap({})
    
    Python collections 모듈의 사용 방법에 관한 이 글은 여기까지 소개되었습니다. 더 많은 Python collections 모듈 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기