c컬렉션 모듈은 Python의 일반 내장 컨테이너인 사전, 목록, 튜플 및 세트에 대한 확장입니다. 여기에는 전문적인 컨테이너 데이터 유형이 포함되어 있습니다. :
Counter(counter): dict 하위 클래스, 해시 가능한 객체 수를 계산하는 데 사용됩니다.
OrderedDict(순서형 사전): dict 하위 클래스, 데이터 멤버가 추가되는 순서를 기록합니다.
defaultdict(기본 사전): dict 하위 클래스, 팩토리 함수 를 호출하여 dict의 누락된 값에 대한 기본값을 제공합니다.
namedtuple(named tuple): 팩토리 함수는 명명된 필드가 있는 tuple 하위 클래스를 생성합니다.
deque(양방향 queue): queue(list-유사) 컨테이너.
체인지도: 여러 지도에 대해 단일 보기를 생성하는 사전과 유사한 유형입니다.
UserDict: 사전을 래핑하면 사전의 하위 클래스를 더 쉽게 만들 수 있습니다. UserList: 목록 개체를 래핑하면 목록의 하위 클래스를 더 쉽게 만들 수 있습니다. 사용자String: String 개체를 래핑하면 문자열의 하위 클래스를 더 쉽게 만들 수 있습니다.
1. 카운터(counter) Counter는 해시 가능성 개체를 계산하는 데 사용되는 dict의 하위 클래스입니다. 요소는 사전 키로 저장되고 값은 사전 값으로 계산되는 순서가 지정되지 않은 컨테이너입니다. Count는 0 또는 음수를 포함한 모든정수 값을 허용합니다. 카운터 수업은 가방이나 멀티세트 등의 언어 수업과 유사합니다.
해당 요소는 반복 가능 항목에서 계산되거나 다른 맵(또는 카운터)에서 초기화됩니다.class Counter(dict): '''Dict subclass for counting hashable items. Sometimes called a bag or multiset. Elements are stored as dictionary keys and their counts are stored as dictionary values. >>> c = Counter('abcdeabcdabcaba') # count elements from a string >>> c.most_common(3) # three most common elements [('a', 5), ('b', 4), ('c', 3)] >>> sorted(c) # list all unique elements ['a', 'b', 'c', 'd', 'e'] >>> ''.join(sorted(c.elements())) # list elements with repetitions 'aaaaabbbbcccdde' >>> sum(c.values()) # total of all counts 15 >>> c['a'] # count of letter 'a' 5 >>> for elem in 'shazam': # update counts from an iterable ... c[elem] += 1 # by adding 1 to each element's count >>> c['a'] # now there are seven 'a' 7 >>> del c['b'] # remove all 'b' >>> c['b'] # now there are zero 'b' 0 >>> d = Counter('simsalabim') # make another counter >>> c.update(d) # add in the second counter >>> c['a'] # now there are nine 'a' 9 >>> c.clear() # empty the counter >>> c Counter() Note: If a count is set to zero or reduced to zero, it will remain in the counter until the entry is deleted or the counter is cleared: >>> c = Counter('aaabbc') >>> c['b'] -= 2 # reduce the count of 'b' by two >>> c.most_common() # 'b' is still in, but its count is zero [('a', 3), ('c', 1), ('b', 0)] ''' # References: # http://en.wikipedia.org/wiki/Multiset # http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html # http://www.demo2s.com/Tutorial/Cpp/0380set-multiset/Catalog0380set-multiset.htm # http://code.activestate.com/recipes/259174/ # Knuth, TAOCP Vol. II section 4.6.3 def init(*args, **kwds): '''Create a new, empty Counter object. And if given, count elements from an input iterable. Or, initialize the count from another mapping of elements to their counts. >>> c = Counter() # a new, empty counter >>> c = Counter('gallahad') # a new counter from an iterable >>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping >>> c = Counter(a=4, b=2) # a new counter from keyword args ''' if not args: raise TypeError("descriptor 'init' of 'Counter' object " "needs an argument") self, *args = args if len(args) > 1: raise TypeError('expected at most 1 arguments, got %d' % len(args)) super(Counter, self).init() self.update(*args, **kwds) def missing(self, key): 'The count of elements not in the Counter is zero.' # Needed so that self[missing_item] does not raise KeyError return 0 def most_common(self, n=None): '''List the n most common elements and their counts from the most common to the least. If n is None, then list all element counts. >>> Counter('abcdeabcdabcaba').most_common(3) [('a', 5), ('b', 4), ('c', 3)] ''' # Emulate Bag.sortedByCount from Smalltalk if n is None: return sorted(self.items(), key=_itemgetter(1), reverse=True) return _heapq.nlargest(n, self.items(), key=_itemgetter(1)) def elements(self): '''Iterator over elements repeating each as many times as its count. >>> c = Counter('ABCABC') >>> sorted(c.elements()) ['A', 'A', 'B', 'B', 'C', 'C'] # Knuth's example for prime factors of 1836: 2**2 * 3**3 * 17**1 >>> prime_factors = Counter({2: 2, 3: 3, 17: 1}) >>> product = 1 >>> for factor in prime_factors.elements(): # loop over factors ... product *= factor # and multiply them >>> product 1836 Note, if an element's count has been set to zero or is a negative number, elements() will ignore it. ''' # Emulate Bag.do from Smalltalk and Multiset.begin from C++. return _chain.from_iterable(_starmap(_repeat, self.items())) # Override dict methods where necessary @classmethod def fromkeys(cls, iterable, v=None): # There is no equivalent method for counters because setting v=1 # means that no element can have a count greater than one. raise NotImplementedError( 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.') def update(*args, **kwds): '''Like dict.update() but add counts instead of replacing them. Source can be an iterable, a dictionary, or another Counter instance. >>> c = Counter('which') >>> c.update('witch') # add elements from another iterable >>> d = Counter('watch') >>> c.update(d) # add elements from another counter >>> c['h'] # four 'h' in which, witch, and watch 4 ''' # The regular dict.update() operation makes no sense here because the # replace behavior results in the some of original untouched counts # being mixed-in with all of the other counts for a mismash that # doesn't have a straight-forward interpretation in most counting # contexts. Instead, we implement straight-addition. Both the inputs # and outputs are allowed to contain zero and negative counts. if not args: raise TypeError("descriptor 'update' of 'Counter' object " "needs an argument") self, *args = args if len(args) > 1: raise TypeError('expected at most 1 arguments, got %d' % len(args)) iterable = args[0] if args else None if iterable is not None: if isinstance(iterable, Mapping): if self: self_get = self.get for elem, count in iterable.items(): self[elem] = count + self_get(elem, 0) else: super(Counter, self).update(iterable) # fast path when counter is empty else: _count_elements(self, iterable) if kwds: self.update(kwds) def subtract(*args, **kwds): '''Like dict.update() but subtracts counts instead of replacing them. Counts can be reduced below zero. Both the inputs and outputs are allowed to contain zero and negative counts. Source can be an iterable, a dictionary, or another Counter instance. >>> c = Counter('which') >>> c.subtract('witch') # subtract elements from another iterable >>> c.subtract(Counter('watch')) # subtract elements from another counter >>> c['h'] # 2 in which, minus 1 in witch, minus 1 in watch 0 >>> c['w'] # 1 in which, minus 1 in witch, minus 1 in watch -1 ''' if not args: raise TypeError("descriptor 'subtract' of 'Counter' object " "needs an argument") self, *args = args if len(args) > 1: raise TypeError('expected at most 1 arguments, got %d' % len(args)) iterable = args[0] if args else None if iterable is not None: self_get = self.get if isinstance(iterable, Mapping): for elem, count in iterable.items(): self[elem] = self_get(elem, 0) - count else: for elem in iterable: self[elem] = self_get(elem, 0) - 1 if kwds: self.subtract(kwds) def copy(self): 'Return a shallow copy.' return self.class(self) def reduce(self): return self.class, (dict(self),) def delitem(self, elem): 'Like dict.delitem() but does not raise KeyError for missing values.' if elem in self: super().delitem(elem) def repr(self): if not self: return '%s()' % self.class.name try: items = ', '.join(map('%r: %r'.mod, self.most_common())) return '%s({%s})' % (self.class.name, items) except TypeError: # handle case where values are not orderable return '{0}({1!r})'.format(self.class.name, dict(self)) # Multiset-style mathematical operations discussed in: # Knuth TAOCP Volume II section 4.6.3 exercise 19 # and at http://en.wikipedia.org/wiki/Multiset # # Outputs guaranteed to only include positive counts. # # To strip negative and zero counts, add-in an empty counter: # c += Counter() def add(self, other): '''Add counts from two counters. >>> Counter('abbb') + Counter('bcc') Counter({'b': 4, 'c': 2, 'a': 1}) ''' if not isinstance(other, Counter): return NotImplemented result = Counter() for elem, count in self.items(): newcount = count + other[elem] if newcount > 0: result[elem] = newcount for elem, count in other.items(): if elem not in self and count > 0: result[elem] = count return result def sub(self, other): ''' Subtract count, but keep only results with positive counts. >>> Counter('abbbc') - Counter('bccd') Counter({'b': 2, 'a': 1}) ''' if not isinstance(other, Counter): return NotImplemented result = Counter() for elem, count in self.items(): newcount = count - other[elem] if newcount > 0: result[elem] = newcount for elem, count in other.items(): if elem not in self and count < 0: result[elem] = 0 - count return result def or(self, other): '''Union is the maximum of value in either of the input counters. >>> Counter('abbb') | Counter('bcc') Counter({'b': 3, 'c': 2, 'a': 1}) ''' if not isinstance(other, Counter): return NotImplemented result = Counter() for elem, count in self.items(): other_count = other[elem] newcount = other_count if count < other_count else count if newcount > 0: result[elem] = newcount for elem, count in other.items(): if elem not in self and count > 0: result[elem] = count return result def and(self, other): ''' Intersection is the minimum of corresponding counts. >>> Counter('abbb') & Counter('bcc') Counter({'b': 1}) ''' if not isinstance(other, Counter): return NotImplemented result = Counter() for elem, count in self.items(): other_count = other[elem] newcount = count if count < other_count else other_count if newcount > 0: result[elem] = newcount return result def pos(self): 'Adds an empty counter, effectively stripping negative and zero counts' result = Counter() for elem, count in self.items(): if count > 0: result[elem] = count return result def neg(self): '''Subtracts from an empty counter. Strips positive and zero counts, and flips the sign on negative counts. ''' result = Counter() for elem, count in self.items(): if count < 0: result[elem] = 0 - count return result def _keep_positive(self): '''Internal method to strip elements with a negative or zero count''' nonpositive = [elem for elem, count in self.items() if not count > 0] for elem in nonpositive: del self[elem] return self def iadd(self, other): '''Inplace add from another counter, keeping only positive counts. >>> c = Counter('abbb') >>> c += Counter('bcc') >>> c Counter({'b': 4, 'c': 2, 'a': 1}) ''' for elem, count in other.items(): self[elem] += count return self._keep_positive() def isub(self, other): '''Inplace subtract counter, but keep only results with positive counts. >>> c = Counter('abbbc') >>> c -= Counter('bccd') >>> c Counter({'b': 2, 'a': 1}) ''' for elem, count in other.items(): self[elem] -= count return self._keep_positive() def ior(self, other): '''Inplace union is the maximum of value from either counter. >>> c = Counter('abbb') >>> c |= Counter('bcc') >>> c Counter({'b': 3, 'c': 2, 'a': 1}) ''' for elem, other_count in other.items(): count = self[elem] if other_count > count: self[elem] = other_count return self._keep_positive() def iand(self, other): '''Inplace intersection is the minimum of corresponding counts. >>> c = Counter('abbb') >>> c &= Counter('bcc') >>> c Counter({'b': 1}) ''' for elem, count in self.items(): other_count = other[elem] if other_count < count: self[elem] = other_count return self._keep_positive() Counter1) 카운터 생성:
from collections import Counter #Counter 需要申明 a=Counter() # 创建空计数器 b=Counter('aabbbcccc') # 可迭代对象计数的方式创建对象 c = Counter({'red': 4, 'blue': 2}) # 映射方法创建计数器 d = Counter(cats=4, dogs=8) # 键值的方法创建计数器2)
a=Counter({'a':2,'b':6,'c':4,'d':0,'e':-2}) print(a) a['a']=0 #修改了计数器元素里的值 print(a) del a['b'] #删除了元素 print(a) #运行结果 Counter({'b': 6, 'c': 4, 'a': 2, 'd': 0, 'e': -2}) Counter({'b': 6, 'c': 4, 'a': 0, 'd': 0, 'e': -2}) Counter({'c': 4, 'a': 0, 'd': 0, 'e': -2}) del3) 카운터의 일부 기능 most_common(self, n=None):카운터를 목록으로, 요소를 튜플로 변환하고, 가장 일반적인 n개의 요소와 개수 목록을 반환합니다. 가장 일반적인 것부터 시작하여 가장 덜 일반적인 것까지. n이 생략되거나 None이면 Most_common()은 카운터의 모든 요소를 반환합니다. 개수가 같은 요소는 임의로 정렬됩니다.
a=Counter({'a':2,'b':6,'c':4,'d':0,'e':-2}) b=a.most_common() c=a.most_common(2) print(a) print(b,type(b)) print(c,type(c)) #运行结果 Counter({'b': 6, 'c': 4, 'a': 2, 'd': 0, 'e': -2}) [('b', 6), ('c', 4), ('a', 2), ('d', 0), ('e', -2)] <class 'list'> [('b', 6), ('c', 4)] <class 'list'> demoelements(self):요소를 여러 번 반복하는 반복자를 반환합니다. 요소는 무작위 순서로 반환됩니다. 요소의 개수가 1보다 작으면 elements()는 이를 무시합니다.
a=Counter({'a':2,'b':6,'c':4,'d':0,'e':-2}) b=a.elements() c=sorted(a.elements()) print(a) print(b,type(b)) print(c,type(c)) #运行结果 Counter({'b': 6, 'c': 4, 'a': 2, 'd': 0, 'e': -2}) <itertools.chain object at 0x00225A50> <class 'itertools.chain'> ['a', 'a', 'b', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c'] <class 'list'> demoupdate(*args, **kwds):요소는 반복 가능 항목에서 계산되거나 다른 맵(또는 카운터)에서 증가됩니다. dict.update()와 비슷하지만 교체하는 대신 개수를 늘립니다. 또한 iterable은 (키, 값) 쌍이 아닌 일련의 요소여야 합니다.
a=Counter({'a':2,'b':6,'c':4,'d':0,'e':-2}) a.update('abe') a.update({'g':1}) print(a) #运行结果 Counter({'b': 7, 'c': 4, 'a': 3, 'g': 1, 'd': 0, 'e': -1}) demosubtract(*args, **kwds):
반복 가능한 맵(또는 카운터)에서 요소를 뺍니다. dict.update()와 비슷하지만 개수를 바꾸는 대신 뺍니다. 입력과 출력은 모두 0이거나 음수일 수 있습니다.
a=Counter({'a':2,'b':6,'c':4,'d':0,'e':-2}) a.subtract('ade') print(a) #运行结果 Counter({'b': 6, 'c': 4, 'a': 1, 'd': -1, 'e': -3}) demo2. Ordered Dictionary(OrderedDict)
Ordered Dictionary는 일반 사전과 유사하지만 키-값 쌍이 삽입되는 순서를 기억합니다. 순서가 지정된 사전을 반복할 때 항목은 키가 처음 추가된 순서대로 반환됩니다.
class OrderedDict(dict): 'Dictionary that remembers insertion order' # An inherited dict maps keys to values. # The inherited dict provides getitem, len, contains, and get. # The remaining methods are order-aware. # Big-O running times for all methods are the same as regular dictionaries. # The internal self.map dict maps keys to links in a doubly linked list. # The circular doubly linked list starts and ends with a sentinel element. # The sentinel element never gets deleted (this simplifies the algorithm). # The sentinel is in self.hardroot with a weakref proxy in self.root. # The prev links are weakref proxies (to prevent circular references). # Individual links are kept alive by the hard reference in self.map. # Those hard references disappear when a key is deleted from an OrderedDict. def init(*args, **kwds): '''Initialize an ordered dictionary. The signature is the same as regular dictionaries, but keyword arguments are not recommended because their insertion order is arbitrary. ''' if not args: raise TypeError("descriptor 'init' of 'OrderedDict' object " "needs an argument") self, *args = args if len(args) > 1: raise TypeError('expected at most 1 arguments, got %d' % len(args)) try: self.root except AttributeError: self.hardroot = _Link() self.root = root = _proxy(self.hardroot) root.prev = root.next = root self.map = {} self.update(*args, **kwds) def setitem(self, key, value, dict_setitem=dict.setitem, proxy=_proxy, Link=_Link): 'od.setitem(i, y) <==> od[i]=y' # Setting a new item creates a new link at the end of the linked list, # and the inherited dictionary is updated with the new key/value pair. if key not in self: self.map[key] = link = Link() root = self.root last = root.prev link.prev, link.next, link.key = last, root, key last.next = link root.prev = proxy(link) dict_setitem(self, key, value) def delitem(self, key, dict_delitem=dict.delitem): 'od.delitem(y) <==> del od[y]' # Deleting an existing item uses self.map to find the link which gets # removed by updating the links in the predecessor and successor nodes. dict_delitem(self, key) link = self.map.pop(key) link_prev = link.prev link_next = link.next link_prev.next = link_next link_next.prev = link_prev link.prev = None link.next = None def iter(self): 'od.iter() <==> iter(od)' # Traverse the linked list in order. root = self.root curr = root.next while curr is not root: yield curr.key curr = curr.next def reversed(self): 'od.reversed() <==> reversed(od)' # Traverse the linked list in reverse order. root = self.root curr = root.prev while curr is not root: yield curr.key curr = curr.prev def clear(self): 'od.clear() -> None. Remove all items from od.' root = self.root root.prev = root.next = root self.map.clear() dict.clear(self) def popitem(self, last=True): '''od.popitem() -> (k, v), return and remove a (key, value) pair. Pairs are returned in LIFO order if last is true or FIFO order if false. ''' if not self: raise KeyError('dictionary is empty') root = self.root if last: link = root.prev link_prev = link.prev link_prev.next = root root.prev = link_prev else: link = root.next link_next = link.next root.next = link_next link_next.prev = root key = link.key del self.map[key] value = dict.pop(self, key) return key, value def move_to_end(self, key, last=True): '''Move an existing element to the end (or beginning if last==False). Raises KeyError if the element does not exist. When last=True, acts like a fast version of self[key]=self.pop(key). ''' link = self.map[key] link_prev = link.prev link_next = link.next link_prev.next = link_next link_next.prev = link_prev root = self.root if last: last = root.prev link.prev = last link.next = root last.next = root.prev = link else: first = root.next link.prev = root link.next = first root.next = first.prev = link def sizeof(self): sizeof = _sys.getsizeof n = len(self) + 1 # number of links including root size = sizeof(self.dict) # instance dictionary size += sizeof(self.map) * 2 # internal dict and inherited dict size += sizeof(self.hardroot) * n # link objects size += sizeof(self.root) * n # proxy objects return size update = update = MutableMapping.update def keys(self): "D.keys() -> a set-like object providing a view on D's keys" return _OrderedDictKeysView(self) def items(self): "D.items() -> a set-like object providing a view on D's items" return _OrderedDictItemsView(self) def values(self): "D.values() -> an object providing a view on D's values" return _OrderedDictValuesView(self) ne = MutableMapping.ne marker = object() def pop(self, key, default=marker): '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. If key is not found, d is returned if given, otherwise KeyError is raised. ''' if key in self: result = self[key] del self[key] return result if default is self.marker: raise KeyError(key) return default def setdefault(self, key, default=None): 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' if key in self: return self[key] self[key] = default return default @_recursive_repr() def repr(self): 'od.repr() <==> repr(od)' if not self: return '%s()' % (self.class.name,) return '%s(%r)' % (self.class.name, list(self.items())) def reduce(self): 'Return state information for pickling' inst_dict = vars(self).copy() for k in vars(OrderedDict()): inst_dict.pop(k, None) return self.class, (), inst_dict or None, None, iter(self.items()) def copy(self): 'od.copy() -> a shallow copy of od' return self.class(self) @classmethod def fromkeys(cls, iterable, value=None): '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S. If not specified, the value defaults to None. ''' self = cls() for key in iterable: self[key] = value return self def eq(self, other): '''od.eq(y) <==> od==y. Comparison to another OD is order-sensitive while comparison to a regular mapping is order-insensitive. ''' if isinstance(other, OrderedDict): return dict.eq(self, other) and all(map(_eq, self, other)) return dict.eq(self, other) try: from _collections import OrderedDict except ImportError: # Leave the pure Python version in place. pass OrderedDict1) 순서 사전 생성:
from collections import OrderedDict a=dict() # b=OrderedDict() a['a']=1 a['b']=2 a['c']=3 a['d']=4 b['a']=1 b['b']=2 b['c']=3 b['d']=4 print(a,type(a)) print(b,type(b)) #运行结果 {'a': 1, 'c': 3, 'd': 4, 'b': 2} <class 'dict'> OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)]) <class 'collections.OrderedDict'> demo2) 순서 사전 기능:
순서 사전
은 사전의 기능을 상속받으며, 해당 기능만 사전과 다른 점을 아래에 소개합니다. popitem(self, last=True):
사전의 키-값 쌍을 반환하고 삭제합니다. last가 True(기본값)이면 이러한 키-값 쌍은 LIFO 순서로 반환되고, False이면 FIFO 순서로 반환됩니다.
a=OrderedDict() a['a']=1 a['b']=2 a['c']=3 a['d']=4 b=a.popitem() print(a) print(b) #运行结果 OrderedDict([('a', 1), ('b', 2), ('c', 3)]) ('d', 4) demomove_to_end(self, key, last=True):
기존 키를 정렬된 사전의 반대쪽 끝으로 이동합니다. last가 True(기본값)이면 항목이 끝으로 이동하고, last가 False이면 처음으로 이동합니다. 키가 존재하지 않으면 KeyError가 발생합니다.
a=OrderedDict() a['a']=1 a['b']=2 a['c']=3 a['d']=4 print(a) b=a.move_to_end('b') print(a) #运行结果 OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)]) OrderedDict([('a', 1), ('c', 3), ('d', 4), ('b', 2)]) demo3. 기본 사전(defaultdict)
defaultdict는 사전/목록 등이 될 수 있는 사전의 기본값을 지정할 수 있습니다. dict 클래스와 동일한 기능을 가진 새로운 사전형 객체를 반환합니다.
예:
from collections import defaultdict a=defaultdict(list) #默认value为list b=defaultdict(tuple) #默认value为tuple c=defaultdict(dict) #默认value为dict d=dict() print(a) print(b) print(c) print(d) #运行结果 defaultdict(<class 'list'>, {}) defaultdict(<class 'tuple'>, {}) defaultdict(<class 'dict'>, {}) {} demo애플리케이션:
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] d = defaultdict(list) for k, v in s: d[k].append(v) #如果使用普通字典,需要先给字典初始化键值对 c=sorted(d.items()) print(type(s)) print(d) print(c,type(c)) #运行结果 <class 'list'> defaultdict(<class 'list'>, {'red': [1], 'blue': [2, 4], 'yellow': [1, 3]}) [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] <class 'list'> demo기본 사전 기능:
class defaultdict(dict): """ defaultdict(default_factory[, ...]) --> dict with default factory The default factory is called without arguments to produce a new value when a key is not present, in getitem only. A defaultdict compares equal to a dict with the same items. All remaining arguments are treated the same as if they were passed to the dict constructor, including keyword arguments. """ def copy(self): # real signature unknown; restored from doc """ D.copy() -> a shallow copy of D. """ pass def copy(self, *args, **kwargs): # real signature unknown """ D.copy() -> a shallow copy of D. """ pass def getattribute(self, *args, **kwargs): # real signature unknown """ Return getattr(self, name). """ pass def init(self, default_factory=None, **kwargs): # known case of _collections.defaultdict.init """ defaultdict(default_factory[, ...]) --> dict with default factory The default factory is called without arguments to produce a new value when a key is not present, in getitem only. A defaultdict compares equal to a dict with the same items. All remaining arguments are treated the same as if they were passed to the dict constructor, including keyword arguments. # (copied from class doc) """ pass def missing(self, key): # real signature unknown; restored from doc """ missing(key) # Called by getitem for missing key; pseudo-code: if self.default_factory is None: raise KeyError((key,)) self[key] = value = self.default_factory() return value """ pass def reduce(self, *args, **kwargs): # real signature unknown """ Return state information for pickling. """ pass def repr(self, *args, **kwargs): # real signature unknown """ Return repr(self). """ pass default_factory = property(lambda self: object(), lambda self, v: None, lambda self: None) # default """Factory for default value called by missing().""" defaultdict4. 명명된 튜플(namedtuple) 1 ) 명명된 튜플에 대한 설명
给元组中每个位置上的元素命名,它们可以使用常规的元组方法,可以让访问元素可以按名称而不是按位置索引。
collections.namedtuple(typename, field_names, verbose=False, rename=False):
返回一个叫做 typename 的tuple子类,这个新的子类用来创建类tuple(tuple-like)的对象,这个对象拥有可以通过属性访问的字段,并且可以通过下标索引和迭代。
field_names 是一个单独的字符串,这个字符串中包含的所有字段用空格或逗号隔开,例如 'xy' 或 'x,y'.另外, field_names 也可以是字符串的列表,例如 ['x', 'y']。
如果verbose 为 True, 在类被建立后将打印类的定义。相反,它打印的是类的 _source 属性,也就是打印源代码。
如果 rename参数 为 True, 无效的field_names会被自动转换成位置的名称.例如, ['abc', 'def', 'ghi', 'abc'] 将被转换为 ['abc', '_1', 'ghi', '_3'], 来消除关键字 def 和重复的字段名 abc。
2)可命名元组的创建
需要先创建一个类。
from collections import namedtuple myTupleClass=namedtuple('myTupleClass',['x','y']) a=point(1,2) b=point(2,0) print(a,a.x,a.y,type(a)) print(b,b.x,b.y,type(b)) #运行结果 myTupleClass(x=1, y=2) 1 2 <class 'main.myTupleClass'> myTupleClass(x=2, y=0) 2 0 <class 'main.myTupleClass'>
3)可命名元组新创建类的功能属性
如上面创建的myTupleCalss类:
print(help(myTupleClass)) #运行help打印获取 class myTupleClass(builtins.tuple) | myTupleClass(x, y) | | Method resolution order: | myTupleClass | builtins.tuple | builtins.object | | Methods defined here: | | getnewargs(self) | Return self as a plain tuple. Used by copy and pickle. | | repr(self) | Return a nicely formatted representation string | | _asdict(self) | Return a new OrderedDict which maps field names to their values. | | _replace(_self, **kwds) | Return a new myTupleClass object replacing specified fields with new values | | ---------------------------------------------------------------------- | Class methods defined here: | | _make(iterable, new=<built-in method new of type object at 0x6143B5C8>, len=<built-in function len>) from builtins.type | Make a new myTupleClass object from a sequence or iterable | | ---------------------------------------------------------------------- | Static methods defined here: | | new(_cls, x, y) | Create new instance of myTupleClass(x, y) | | ---------------------------------------------------------------------- | Data descriptors defined here: | | x | Alias for field number 0 | | y | Alias for field number 1 | | ---------------------------------------------------------------------- | Data and other attributes defined here: | | _fields = ('x', 'y') | | _source = "from builtins import property as _property, tupl..._itemget... | | ---------------------------------------------------------------------- | Methods inherited from builtins.tuple: | | add(self, value, /) | Return self+value. | | contains(self, key, /) | Return key in self. | | eq(self, value, /) | Return self==value. | | ge(self, value, /) | Return self>=value. | | getattribute(self, name, /) | Return getattr(self, name). | | getitem(self, key, /) | Return self[key]. | | gt(self, value, /) | Return self>value. | | hash(self, /) | Return hash(self). | | iter(self, /) | Implement iter(self). | | le(self, value, /) | Return self<=value. | | len(self, /) | Return len(self). | | lt(self, value, /) | Return self<value. | | mul(self, value, /) | Return self*value.n | | ne(self, value, /) | Return self!=value. | | rmul(self, value, /) | Return self*value. | | count(...) | T.count(value) -> integer -- return number of occurrences of value | | index(...) | T.index(value, [start, [stop]]) -> integer -- return first index of value. | Raises ValueError if the value is not present. None myTupleCalss
5.队列(deque)
1)双向队列(deque)
双向队列(Deque)是栈和队列的一般化。可以在两端添加和删除元素。
双向队列的创建:
from collections import deque a=deque() b=deque('abcd') print(a,type(a)) print(b,type(b)) #运行结果 deque([]) <class 'collections.deque'> deque(['a', 'b', 'c', 'd']) <class 'collections.deque'>
双向队列的功能属性:
class deque(object): """ deque([iterable[, maxlen]]) --> deque object A list-like sequence optimized for data accesses near its endpoints. """ def append(self, *args, **kwargs): # real signature unknown """ Add an element to the right side of the deque. """ pass def appendleft(self, *args, **kwargs): # real signature unknown """ Add an element to the left side of the deque. """ pass def clear(self, *args, **kwargs): # real signature unknown """ Remove all elements from the deque. """ pass def copy(self, *args, **kwargs): # real signature unknown """ Return a shallow copy of a deque. """ pass def count(self, value): # real signature unknown; restored from doc """ D.count(value) -> integer -- return number of occurrences of value """ return 0 def extend(self, *args, **kwargs): # real signature unknown """ Extend the right side of the deque with elements from the iterable """ pass def extendleft(self, *args, **kwargs): # real signature unknown """ Extend the left side of the deque with elements from the iterable """ pass def index(self, value, start=None, stop=None): # real signature unknown; restored from doc """ D.index(value, [start, [stop]]) -> integer -- return first index of value. Raises ValueError if the value is not present. """ return 0 def insert(self, index, p_object): # real signature unknown; restored from doc """ D.insert(index, object) -- insert object before index """ pass def pop(self, *args, **kwargs): # real signature unknown """ Remove and return the rightmost element. """ pass def popleft(self, *args, **kwargs): # real signature unknown """ Remove and return the leftmost element. """ pass def remove(self, value): # real signature unknown; restored from doc """ D.remove(value) -- remove first occurrence of value. """ pass def reverse(self): # real signature unknown; restored from doc """ D.reverse() -- reverse *IN PLACE* """ pass def rotate(self, *args, **kwargs): # real signature unknown """ Rotate the deque n steps to the right (default n=1). If n is negative, rotates left. """ pass def add(self, *args, **kwargs): # real signature unknown """ Return self+value. """ pass def bool(self, *args, **kwargs): # real signature unknown """ self != 0 """ pass def contains(self, *args, **kwargs): # real signature unknown """ Return key in self. """ pass def copy(self, *args, **kwargs): # real signature unknown """ Return a shallow copy of a deque. """ pass def delitem(self, *args, **kwargs): # real signature unknown """ Delete self[key]. """ pass def eq(self, *args, **kwargs): # real signature unknown """ Return self==value. """ pass def getattribute(self, *args, **kwargs): # real signature unknown """ Return getattr(self, name). """ pass def getitem(self, *args, **kwargs): # real signature unknown """ Return self[key]. """ pass def ge(self, *args, **kwargs): # real signature unknown """ Return self>=value. """ pass def gt(self, *args, **kwargs): # real signature unknown """ Return self>value. """ pass def iadd(self, *args, **kwargs): # real signature unknown """ Implement self+=value. """ pass def imul(self, *args, **kwargs): # real signature unknown """ Implement self*=value. """ pass def init(self, iterable=(), maxlen=None): # known case of _collections.deque.init """ deque([iterable[, maxlen]]) --> deque object A list-like sequence optimized for data accesses near its endpoints. # (copied from class doc) """ pass def iter(self, *args, **kwargs): # real signature unknown """ Implement iter(self). """ pass def len(self, *args, **kwargs): # real signature unknown """ Return len(self). """ pass def le(self, *args, **kwargs): # real signature unknown """ Return self<=value. """ pass def lt(self, *args, **kwargs): # real signature unknown """ Return self<value. """ pass def mul(self, *args, **kwargs): # real signature unknown """ Return self*value.n """ pass @staticmethod # known case of new def new(*args, **kwargs): # real signature unknown """ Create and return a new object. See help(type) for accurate signature. """ pass def ne(self, *args, **kwargs): # real signature unknown """ Return self!=value. """ pass def reduce(self, *args, **kwargs): # real signature unknown """ Return state information for pickling. """ pass def repr(self, *args, **kwargs): # real signature unknown """ Return repr(self). """ pass def reversed(self): # real signature unknown; restored from doc """ D.reversed() -- return a reverse iterator over the deque """ pass def rmul(self, *args, **kwargs): # real signature unknown """ Return self*value. """ pass def setitem(self, *args, **kwargs): # real signature unknown """ Set self[key] to value. """ pass def sizeof(self): # real signature unknown; restored from doc """ D.sizeof() -- size of D in memory, in bytes """ pass maxlen = property(lambda self: object(), lambda self, v: None, lambda self: None) # default """maximum size of a deque or None if unbounded""" hash = None deque
2)单向队列(queue.Queue)
class queue.Queue(maxsize=0)
单向队列与双向队列的区别是FIFO(先进先出),maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被取出。如果maxsize小于或者等于0,则队列大小没有限制。
单向队列的创建:
import queue a=queue.Queue() b=queue.Queue('abcd') print(a,type(a)) print(b,type(b)) #运行结果 <queue.Queue object at 0x00FBB310> <class 'queue.Queue'> <queue.Queue object at 0x01522DF0> <class 'queue.Queue'>
单向队列的功能属性:
class Queue: '''Create a queue object with a given maximum size. If maxsize is <= 0, the queue size is infinite. ''' def init(self, maxsize=0): self.maxsize = maxsize self._init(maxsize) # mutex must be held whenever the queue is mutating. All methods # that acquire mutex must release it before returning. mutex # is shared between the three conditions, so acquiring and # releasing the conditions also acquires and releases mutex. self.mutex = threading.Lock() # Notify not_empty whenever an item is added to the queue; a # thread waiting to get is notified then. self.not_empty = threading.Condition(self.mutex) # Notify not_full whenever an item is removed from the queue; # a thread waiting to put is notified then. self.not_full = threading.Condition(self.mutex) # Notify all_tasks_done whenever the number of unfinished tasks # drops to zero; thread waiting to join() is notified to resume self.all_tasks_done = threading.Condition(self.mutex) self.unfinished_tasks = 0 def task_done(self): '''Indicate that a formerly enqueued task is complete. Used by Queue consumer threads. For each get() used to fetch a task, a subsequent call to task_done() tells the queue that the processing on the task is complete. If a join() is currently blocking, it will resume when all items have been processed (meaning that a task_done() call was received for every item that had been put() into the queue). Raises a ValueError if called more times than there were items placed in the queue. ''' with self.all_tasks_done: unfinished = self.unfinished_tasks - 1 if unfinished <= 0: if unfinished < 0: raise ValueError('task_done() called too many times') self.all_tasks_done.notify_all() self.unfinished_tasks = unfinished def join(self): '''Blocks until all items in the Queue have been gotten and processed. The count of unfinished tasks goes up whenever an item is added to the queue. The count goes down whenever a consumer thread calls task_done() to indicate the item was retrieved and all work on it is complete. When the count of unfinished tasks drops to zero, join() unblocks. ''' with self.all_tasks_done: while self.unfinished_tasks: self.all_tasks_done.wait() def qsize(self): '''Return the approximate size of the queue (not reliable!).''' with self.mutex: return self._qsize() def empty(self): '''Return True if the queue is empty, False otherwise (not reliable!). This method is likely to be removed at some point. Use qsize() == 0 as a direct substitute, but be aware that either approach risks a race condition where a queue can grow before the result of empty() or qsize() can be used. To create code that needs to wait for all queued tasks to be completed, the preferred technique is to use the join() method. ''' with self.mutex: return not self._qsize() def full(self): '''Return True if the queue is full, False otherwise (not reliable!). This method is likely to be removed at some point. Use qsize() >= n as a direct substitute, but be aware that either approach risks a race condition where a queue can shrink before the result of full() or qsize() can be used. ''' with self.mutex: return 0 < self.maxsize <= self._qsize() def put(self, item, block=True, timeout=None): '''Put an item into the queue. If optional args 'block' is true and 'timeout' is None (the default), block if necessary until a free slot is available. If 'timeout' is a non-negative number, it blocks at most 'timeout' seconds and raises the Full exception if no free slot was available within that time. Otherwise ('block' is false), put an item on the queue if a free slot is immediately available, else raise the Full exception ('timeout' is ignored in that case). ''' with self.not_full: if self.maxsize > 0: if not block: if self._qsize() >= self.maxsize: raise Full elif timeout is None: while self._qsize() >= self.maxsize: self.not_full.wait() elif timeout < 0: raise ValueError("'timeout' must be a non-negative number") else: endtime = time() + timeout while self._qsize() >= self.maxsize: remaining = endtime - time() if remaining <= 0.0: raise Full self.not_full.wait(remaining) self._put(item) self.unfinished_tasks += 1 self.not_empty.notify() def get(self, block=True, timeout=None): '''Remove and return an item from the queue. If optional args 'block' is true and 'timeout' is None (the default), block if necessary until an item is available. If 'timeout' is a non-negative number, it blocks at most 'timeout' seconds and raises the Empty exception if no item was available within that time. Otherwise ('block' is false), return an item if one is immediately available, else raise the Empty exception ('timeout' is ignored in that case). ''' with self.not_empty: if not block: if not self._qsize(): raise Empty elif timeout is None: while not self._qsize(): self.not_empty.wait() elif timeout < 0: raise ValueError("'timeout' must be a non-negative number") else: endtime = time() + timeout while not self._qsize(): remaining = endtime - time() if remaining <= 0.0: raise Empty self.not_empty.wait(remaining) item = self._get() self.not_full.notify() return item def put_nowait(self, item): '''Put an item into the queue without blocking. Only enqueue the item if a free slot is immediately available. Otherwise raise the Full exception. ''' return self.put(item, block=False) def get_nowait(self): '''Remove and return an item from the queue without blocking. Only get an item if one is immediately available. Otherwise raise the Empty exception. ''' return self.get(block=False) # Override these methods to implement other queue organizations # (e.g. stack or priority queue). # These will only be called with appropriate locks held # Initialize the queue representation def _init(self, maxsize): self.queue = deque() def _qsize(self): return len(self.queue) # Put a new item in the queue def _put(self, item): self.queue.append(item) # Get an item from the queue def _get(self): return self.queue.popleft() queue.Queue
6.深浅拷贝
浅拷贝和深拷贝的主要区别在与操作后内存地址的变化是不同的。
위 내용은 Python 컬렉션 모듈과 심층 및 얕은 복사에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

하루에 2 시간 동안 파이썬을 배우는 것으로 충분합니까? 목표와 학습 방법에 따라 다릅니다. 1) 명확한 학습 계획을 개발, 2) 적절한 학습 자원 및 방법을 선택하고 3) 실습 연습 및 검토 및 통합 연습 및 검토 및 통합,이 기간 동안 Python의 기본 지식과 고급 기능을 점차적으로 마스터 할 수 있습니다.

웹 개발에서 Python의 주요 응용 프로그램에는 Django 및 Flask 프레임 워크 사용, API 개발, 데이터 분석 및 시각화, 머신 러닝 및 AI 및 성능 최적화가 포함됩니다. 1. Django 및 Flask 프레임 워크 : Django는 복잡한 응용 분야의 빠른 개발에 적합하며 플라스크는 소형 또는 고도로 맞춤형 프로젝트에 적합합니다. 2. API 개발 : Flask 또는 DjangorestFramework를 사용하여 RESTFULAPI를 구축하십시오. 3. 데이터 분석 및 시각화 : Python을 사용하여 데이터를 처리하고 웹 인터페이스를 통해 표시합니다. 4. 머신 러닝 및 AI : 파이썬은 지능형 웹 애플리케이션을 구축하는 데 사용됩니다. 5. 성능 최적화 : 비동기 프로그래밍, 캐싱 및 코드를 통해 최적화

Python은 개발 효율에서 C보다 낫지 만 C는 실행 성능이 높습니다. 1. Python의 간결한 구문 및 풍부한 라이브러리는 개발 효율성을 향상시킵니다. 2.C의 컴파일 유형 특성 및 하드웨어 제어는 실행 성능을 향상시킵니다. 선택할 때는 프로젝트 요구에 따라 개발 속도 및 실행 효율성을 평가해야합니다.

Python의 실제 응용 프로그램에는 데이터 분석, 웹 개발, 인공 지능 및 자동화가 포함됩니다. 1) 데이터 분석에서 Python은 Pandas 및 Matplotlib를 사용하여 데이터를 처리하고 시각화합니다. 2) 웹 개발에서 Django 및 Flask 프레임 워크는 웹 응용 프로그램 생성을 단순화합니다. 3) 인공 지능 분야에서 Tensorflow와 Pytorch는 모델을 구축하고 훈련시키는 데 사용됩니다. 4) 자동화 측면에서 파이썬 스크립트는 파일 복사와 같은 작업에 사용할 수 있습니다.

Python은 데이터 과학, 웹 개발 및 자동화 스크립팅 필드에 널리 사용됩니다. 1) 데이터 과학에서 Python은 Numpy 및 Pandas와 같은 라이브러리를 통해 데이터 처리 및 분석을 단순화합니다. 2) 웹 개발에서 Django 및 Flask 프레임 워크를 통해 개발자는 응용 프로그램을 신속하게 구축 할 수 있습니다. 3) 자동 스크립트에서 Python의 단순성과 표준 라이브러리가 이상적입니다.

Python의 유연성은 다중 파리가 지원 및 동적 유형 시스템에 반영되며, 사용 편의성은 간단한 구문 및 풍부한 표준 라이브러리에서 나옵니다. 유연성 : 객체 지향, 기능 및 절차 프로그래밍을 지원하며 동적 유형 시스템은 개발 효율성을 향상시킵니다. 2. 사용 편의성 : 문법은 자연 언어에 가깝고 표준 라이브러리는 광범위한 기능을 다루며 개발 프로세스를 단순화합니다.

Python은 초보자부터 고급 개발자에 이르기까지 모든 요구에 적합한 단순성과 힘에 호의적입니다. 다목적 성은 다음과 같이 반영됩니다. 1) 배우고 사용하기 쉽고 간단한 구문; 2) Numpy, Pandas 등과 같은 풍부한 라이브러리 및 프레임 워크; 3) 다양한 운영 체제에서 실행할 수있는 크로스 플랫폼 지원; 4) 작업 효율성을 향상시키기위한 스크립팅 및 자동화 작업에 적합합니다.

예, 하루에 2 시간 후에 파이썬을 배우십시오. 1. 합리적인 학습 계획 개발, 2. 올바른 학습 자원을 선택하십시오. 3. 실습을 통해 학습 된 지식을 통합하십시오. 이 단계는 짧은 시간 안에 Python을 마스터하는 데 도움이 될 수 있습니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경
