파이썬에는 데이터형 컨테이너 모듈로 설명되는 모듈 컬렉션이 있습니다. 자주 사용되는 collection.defaultdict()가 있습니다. 주로 이런 얘기를 합니다.
개요:
여기서 defaultdict(function_factory)는 키 값이 스스로 결정되지만 값 유형은 사전과 유사한 객체를 구성합니다. 는 function_factory의 클래스 인스턴스이며 기본값이 있습니다. 예를 들어 default(int)는 사전형 객체를 생성하고, 그 안의 모든 값은 int의 인스턴스이며, 존재하지 않는 키라도 d[key]에도 기본값이 있습니다. int()의 기본값입니다. 0.
defaultdict
결측값을 제공하기 위해 팩토리 함수를 호출하는 dict 하위 클래스입니다.
간략한 설명입니다
defaultdict는 내장 함수 dict의 하위 클래스에 속하며 팩토리 함수를 호출하여 누락된 값을 제공합니다.
팩토리 함수가 무엇인지 혼란스럽습니다:
파이썬 코어 프로그래밍에 대한 설명
Python 2.2는 유형과 클래스를 통합하고 모든 내장 유형이 이제 클래스입니다. 이에 대해 기본적으로 int(), type(), list() 등과 같은 소위 내장 변환 함수라고 불리는 원래
는 이제 팩토리 함수가 되었습니다. 즉,
함수처럼 보이지만 실제로는 클래스입니다. 호출하면 실제로 상품을 생산하는 공장처럼 유형의 인스턴스가 생성됩니다.
다음 친숙한 팩토리 함수는 이전 Python 버전에서 내장 함수라고 합니다.
int(), long(), float(), complex()
str (), unicode(), basestring()
list(), tuple()
type()
이전에는 Factory 기능이 없었던 다른 유형, 이제는 있습니다. 공장 기능이기도 합니다. 또한 새로운 스타일 클래스
를 지원하는 새로운 데이터 유형에 해당하는 팩토리 함수도 추가되었습니다. 이러한 팩토리 함수는 다음과 같습니다:
dict()
bool()
set(),frozenset()
object()
classmethod()
staticmethod()
super()
property()
file()
다시 가져오기 사용법을 살펴보세요:
import collections s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] d = collections.defaultdict(list) for k, v in s: d[k].append(v) list(d.items())
defaultdict가 내장 함수 목록을 매개변수로 받아들일 수 있다는 것이 이해되기 시작했습니다. . 실제로 list() 자체는 내장 함수이지만 업데이트 후에는 Python의 모든 것이 객체이므로 list가 클래스에 적용되고 list가 도입될 때 클래스의 인스턴스가 생성됩니다.
그래도 이해가 안 된다면 defaultdict의 도움말 설명을 다시 살펴보겠습니다.
class collections.defaultdict([default_factory[, ...]])
Returns 새로운 사전형 객체입니다. defaultdict는 내장 dict 클래스의 하위 클래스입니다. 이는 하나의 메서드를 재정의하고 하나의 쓰기 가능한 인스턴스 변수를 추가합니다. 나머지 기능은 dict 클래스와 동일하며 여기에 설명되어 있지 않습니다.
우선, collections.defaultdict는 사전과 유사한 객체를 반환하지만 정확히 동일한 객체는 아닙니다. defaultdict 클래스는 메서드를 오버로드하고 쓰기 가능한 인스턴스 변수를 추가한다는 점을 제외하면 dict 클래스와 거의 동일합니다. (쓰기 가능한 인스턴스 변수, 아직 이해하지 못함)
첫 번째 인수는 default_factory 속성의 초기 값을 제공하며, 기본값은 None입니다. 키워드 인수를 포함한 dict 생성자.
defaultdict 객체는 표준 dict 작업 외에도 다음 메서드를 지원합니다.
__missing__(key)
default_factory 속성이 None인 경우, 이는 키를 인수로 사용하여 KeyError 예외를 발생시킵니다.
default_factory가 None이 아닌 경우 인수 없이 호출되어 지정된 키에 대한 기본값을 제공하고 이 값은 키에 대한 사전에 삽입됩니다. .
주로 이것에 중점을 둡니다. default_factory가 None이 아닌 경우 이 default_factory는 매개변수 없는 형식으로 호출되어 ___missing__ 메서드의 키에 기본값을 제공합니다. 이 기본값은 데이터 사전에 키로 삽입된 다음 반환됩니다.
아주 어지러워요. __missing__ 메서드가 있습니다. 이 __missing__ 메서드는 collections.defaultdict()의 내장 메서드입니다.
default_factory를 호출하여 예외가 발생하면 이 예외는 변경되지 않고 전파됩니다.
이 메서드는 요청된 키가 무엇이든 반환되지 않을 때 dict 클래스의 __getitem__() 메서드에 의해 호출됩니다. 그런 다음 raises는 __getitem__()에 의해 반환되거나 발생합니다.
__missing__()은 __getitem__() 이외의 작업에 대해 호출되지 않습니다. 이는 get()이 일반 사전과 마찬가지로 기본값으로 None을 반환한다는 것을 의미합니다. default_factory를 사용하는 대신
defaultdict 객체는 다음 인스턴스 변수를 지원합니다:
default_factory
이 속성은 __missing__() 메서드에서 사용되며 첫 번째 인수에서 초기화됩니다. 존재하는 경우 생성자에, 존재하지 않는 경우 None에.
이 문서는 이해하기 어려운 것 같습니다. 예시를 직접 보세요:
import collections s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] # defaultdict d = collections.defaultdict(list) for k, v in s: d[k].append(v) # Use dict and setdefault g = {} for k, v in s: g.setdefault(k, []).append(v) # Use dict e = {} for k, v in s: e[k] = v ##list(d.items()) ##list(g.items()) ##list(e.items())
결과 보기
list(d.items()) [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] >>> list(g.items()) [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] >>> list(e.items()) [('blue', 4), ('red', 1), ('yellow', 3)] >>> d defaultdict(<class 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]}) >>> g {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]} >>> e {'blue': 4, 'red': 1, 'yellow': 3} >>> d.items() dict_items([('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]) >>> d["blue"] [2, 4] >>> d.keys() dict_keys(['blue', 'red', 'yellow']) >>> d.default_factory <class 'list'> >>> d.values() dict_values([[2, 4], [1], [1, 3]])
collections.defaultdict(list)를 사용한 효과는 dict.setdefault()를 사용한 효과와 유사함을 알 수 있습니다
python help上也这么说了
When each key is encountered for the first time, it is not already in the mapping; so an entry is automatically created using the default_factory function which returns an empty list. The list.append() operation then attaches the value to the new list. When keys are encountered again, the look-up proceeds normally (returning the list for that key) and the list.append() operation adds another value to the list. This technique is simpler and faster than an equivalent technique using dict.setdefault():
说这种方法会和dict.setdefault()等价,但是要更快。
有必要看看dict.setdefault()
setdefault(key[, default])
If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.
如果这个key已经在dictionary里面存着,返回value.如果key不存在,插入key和一个default value,返回Default. 默认的defaults是None.
但是这里要注意的是defaultdict是和dict.setdefault等价,和下面那个直接赋值是有区别的。从结果里面就可以看到,直接赋值会覆盖。
从最后的d.values还有d[“blue”]来看,后面的使用其实是和dict的用法一样的,唯一不同的就是初始化的问题。defaultdict可以利用工厂函数,给初始keyi带来一个默认值。
这个默认值也许是空的list[] defaultdict(list), 也许是0, defaultdict(int).
再看看下面的这个例子。
defaultdict(int) 这里的d其实是生成了一个默认为0的带key的数据字典。你可以想象成 d[key] = int default (int工厂函数的默认值为0)
d[k]所以可以直接读取 d[“m”] += 1 就是d[“m”] 就是默认值 0+1 = 1
后面的道理就一样了。
>>> s = 'mississippi' >>> d = defaultdict(int) >>> for k in s: ... d[k] += 1 ... >>> list(d.items()) [('i', 4), ('p', 2), ('s', 4), ('m', 1)]