Collections.defaultdict 차이와 일반 dict
저는 파이썬 문서의 예시를 읽었지만, 여전히 이 방법이 무엇을 의미하는지 이해할 수 없습니다.누가 도와줄 수 있어요?여기 파이썬 문서의 두 가지 예가 있습니다.
>>> from collections import defaultdict
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
... d[k] += 1
...
>>> d.items()
dict_items([('m', 1), ('i', 4), ('s', 4), ('p', 2)])
그리고.
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
... d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
원int
그리고.list
무엇을 위한 것입니까?
보통, 파이썬 사전은 다음을 던집니다.KeyError
현재 사전에 없는 키가 있는 항목을 가져오려고 하는 경우. 그defaultdict
이와 대조적으로 액세스하려는 항목은 모두 생성됩니다(물론 아직 존재하지 않는 경우).이러한 "기본" 항목을 만들기 위해 생성자에게 전달하는 함수 개체를 호출합니다(더 정확하게는 함수 및 유형 개체를 포함하는 임의의 "호출 가능" 개체입니다). 번째이 " 번예에다사음기용생항본다성니됩목이여첫하을는째서"를 사용하여 생성됩니다.int()
정수 객체 그면정객반환다니됩가를 반환합니다.0
이 " 번예에다사음기용생항본다성니됩목이여두하을는째"를 사용하여 생성됩니다.list()
새 빈 목록 개체를 반환합니다.
defaultdict
사전에서 키를 찾을 수 없다면, 대신에KeyError
새 항목이 생성됩니다.이 새 항목의 유형은 defaultdict 인수로 지정됩니다.
예:
somedict = {}
print(somedict[3]) # KeyError
someddict = defaultdict(int)
print(someddict[3]) # print int(), thus 0
불이행 명령
을 설정하는 가 포함되어 있습니다.표준 사전에는 값을 검색하고 값이 존재하지 않는 경우 기본값을 설정하기 위한 메서드 setdefault()가 포함되어 있습니다. 적으로대조,,defaultdict
에서는 컨테이너가 초기화될 때 호출자가 앞에서 기본값(반환할 값)을 지정할 수 있습니다."
Doug Hellmann이 Python Standard Library의 예에서 정의한 바와 같이
기본 딕트 사용 방법
기본 명령 가져오기
>>> from collections import defaultdict
기본 명령 초기화
전달하여 초기화
첫 번째 인수로 호출 가능한(아래)
>>> d_int = defaultdict(int)
>>> d_list = defaultdict(list)
>>> def foo():
... return 'default value'
...
>>> d_foo = defaultdict(foo)
>>> d_int
defaultdict(<type 'int'>, {})
>>> d_list
defaultdict(<type 'list'>, {})
>>> d_foo
defaultdict(<function foo at 0x7f34a0a69578>, {})
**kwargs를 두 번째 인수로 지정(선택 사항)
>>> d_int = defaultdict(int, a=10, b=12, c=13)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
또는
>>> kwargs = {'a':10,'b':12,'c':13}
>>> d_int = defaultdict(int, **kwargs)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
작동 방식
표준 사전의 하위 클래스와 마찬가지로 모든 동일한 기능을 수행할 수 있습니다.
그러나 알 수 없는 키를 전달하는 경우 오류 대신 기본값을 반환합니다.예:
>>> d_int['a']
10
>>> d_int['d']
0
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12, 'd': 0})
기본값 overwrite default_factory를 변경하려는 경우:
>>> d_int.default_factory = lambda: 1
>>> d_int['e']
1
>>> d_int
defaultdict(<function <lambda> at 0x7f34a0a91578>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0})
또는
>>> def foo():
... return 2
>>> d_int.default_factory = foo
>>> d_int['f']
2
>>> d_int
defaultdict(<function foo at 0x7f34a0a0a140>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0, 'f': 2})
질문의 예
예 1
int가 default_factory로 전달되었으므로 알 수 없는 키는 기본적으로 0을 반환합니다.
이제 문자열이 루프에서 전달되면 d에서 해당 알파벳의 수가 증가합니다.
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> d.default_factory
<type 'int'>
>>> for k in s:
... d[k] += 1
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
>>> d
defaultdict(<type 'int'>, {'i': 4, 'p': 2, 's': 4, 'm': 1})
예 2
목록이 default_factory로 전달되었기 때문에 알 수 없는(존재하지 않는) 키는 [ ](즉,목록)을 기본값으로 선택합니다.
이제 튜플 목록이 루프에서 전달되면 d[color]에 값이 추가됩니다.
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> d.default_factory
<type 'list'>
>>> for k, v in s:
... d[k].append(v)
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
>>> d
defaultdict(<type 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})
사전은 나중에 이름(키)으로 검색할 수 있도록 데이터를 저장하는 편리한 방법입니다.키는 고유하고 변경할 수 없는 개체여야 하며 일반적으로 문자열입니다.사전의 값은 임의의 값이 될 수 있습니다.대부분의 응용 프로그램에서 값은 정수 및 문자열과 같은 단순 유형입니다.
사전의 값이 모음(목록, 딕트 등)일 때 더 흥미로워집니다.이 경우 지정된 키를 처음 사용할 때 값(공백 목록 또는 딕트)을 초기화해야 합니다.이 작업은 수동으로 수행하는 것이 비교적 쉽지만 기본 dict 유형은 이러한 작업을 자동화하고 단순화합니다.기본 딕트는 일반 딕트와 똑같이 작동하지만 인수를 사용하지 않고 존재하지 않는 키의 기본값을 제공하는 함수("기본 팩토리")로 초기화됩니다.
기본 명령어는 키 오류를 발생시키지 않습니다.존재하지 않는 키는 기본 출고 시에 반환되는 값을 가져옵니다.
from collections import defaultdict
ice_cream = defaultdict(lambda: 'Vanilla')
ice_cream['Sarah'] = 'Chunky Monkey'
ice_cream['Abdul'] = 'Butter Pecan'
print(ice_cream['Sarah'])
>>>Chunky Monkey
print(ice_cream['Joe'])
>>>Vanilla
다음은 기본 명령을 사용하여 복잡성을 줄일 수 있는 방법에 대한 다른 예입니다.
from collections import defaultdict
# Time complexity O(n^2)
def delete_nth_naive(array, n):
ans = []
for num in array:
if ans.count(num) < n:
ans.append(num)
return ans
# Time Complexity O(n), using hash tables.
def delete_nth(array,n):
result = []
counts = defaultdict(int)
for i in array:
if counts[i] < n:
result.append(i)
counts[i] += 1
return result
x = [1,2,3,1,2,1,2,3]
print(delete_nth(x, n=2))
print(delete_nth_naive(x, n=2))
결론적으로 사전이 필요하고 각 요소의 값이 기본값으로 시작해야 할 때마다 기본 딕트를 사용합니다.
여기에 기본 명령에 대한 훌륭한 설명이 있습니다. http://ludovf.net/blog/python-collections-defaultdict/
기본적으로 int 및 list 매개변수는 전달하는 함수입니다.Python은 함수 이름을 인수로 수락합니다.int는 기본적으로 0을 반환하고 list는 괄호와 함께 호출될 때 빈 목록을 반환합니다.
일반적인 사전에서, 당신의 예에서 내가 전화를 시도한다면,d[a]
s, i및키되지 않았기 가 발생합니다. m, s, i, p가 발생합니다.그러나 기본 명령어에서는 함수 이름을 인수로 사용합니다. 초기화되지 않은 키를 사용하려고 하면 전달된 함수를 호출하고 반환 값을 새 키의 값으로 할당합니다.
의 동작defaultdict
를 사용하여 쉽게 흉내낼 수 있습니다.dict.setdefault
대신에d[key]
전화가 올 때마다
즉, 코드는 다음과 같습니다.
from collections import defaultdict
d = defaultdict(list)
print(d['key']) # empty list []
d['key'].append(1) # adding constant 1 to the list
print(d['key']) # list containing the constant [1]
다음과 같습니다.
d = dict()
print(d.setdefault('key', list())) # empty list []
d.setdefault('key', list()).append(1) # adding constant 1 to the list
print(d.setdefault('key', list())) # list containing the constant [1]
유일한 차이점은 다음과 같습니다.defaultdict
리스트 생성자는 한 번만 호출되며, 다음을 사용합니다.dict.setdefault
목록 생성자를 더 자주 호출할 수 있습니다(그러나 실제로 필요한 경우 코드를 다시 작성하여 이를 방지할 수도 있습니다).
어떤 사람들은 성과에 대한 고려가 있다고 주장할 수 있지만, 이 주제는 지뢰밭입니다.예를 들어, 이 게시물은 기본 명령어를 사용해도 성능이 크게 향상되지 않음을 보여줍니다.
IMO, defaultdict는 코드에 이점보다 혼란을 더 많이 추가하는 모음입니다.저에게는 쓸모가 없지만, 다른 사람들은 다르게 생각할 수도 있습니다.
질문이 "어떻게 작동하는지"에 관한 것이기 때문에, 일부 독자들은 더 많은 너트와 볼트를 보고 싶어할 수도 있습니다.구체적으로, 문제가 되는 방법은__missing__(key)
방법.https://docs.python.org/2/library/collections.html#defaultdict-objects 을 참조하십시오.
좀 더 구체적으로, 이 대답은 어떻게 활용할 것인지를 보여줍니다.__missing__(key)
실용적인 방법으로: https://stackoverflow.com/a/17956989/1593924
'통화 가능'의 의미를 명확히 하기 위해 대화형 세션이 있습니다(2.7.6부터 시작하지만 v3에서도 작동해야 함).
>>> x = int
>>> x
<type 'int'>
>>> y = int(5)
>>> y
5
>>> z = x(5)
>>> z
5
>>> from collections import defaultdict
>>> dd = defaultdict(int)
>>> dd
defaultdict(<type 'int'>, {})
>>> dd = defaultdict(x)
>>> dd
defaultdict(<type 'int'>, {})
>>> dd['a']
0
>>> dd
defaultdict(<type 'int'>, {'a': 0})
그것은 x 변수의 무의미한 사용을 제외하고 기본 명령어의 가장 일반적인 사용이었습니다.0에서 명시적 기본값과 동일한 작업을 수행할 수 있지만 단순 값으로는 수행할 수 없습니다.
>>> dd2 = defaultdict(0)
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
dd2 = defaultdict(0)
TypeError: first argument must be callable
대신, 다음은 단순 함수를 전달하기 때문에 작동합니다(즉시 인수를 사용하지 않고 항상 0을 반환하는 이름 없는 함수를 만듭니다).
>>> dd2 = defaultdict(lambda: 0)
>>> dd2
defaultdict(<function <lambda> at 0x02C4C130>, {})
>>> dd2['a']
0
>>> dd2
defaultdict(<function <lambda> at 0x02C4C130>, {'a': 0})
>>>
기본값이 다른 경우:
>>> dd3 = defaultdict(lambda: 1)
>>> dd3
defaultdict(<function <lambda> at 0x02C4C170>, {})
>>> dd3['a']
1
>>> dd3
defaultdict(<function <lambda> at 0x02C4C170>, {'a': 1})
>>>
나만의 2가지 요소: 기본 명령어를 하위 클래스로 분류할 수도 있습니다.
class MyDict(defaultdict):
def __missing__(self, key):
value = [None, None]
self[key] = value
return value
이것은 매우 복잡한 경우에 유용할 수 있습니다.
기본 명령은 다음과 같은 경우에도 키 오류를 발생시킬 수 있습니다.
from collections import defaultdict
d = defaultdict()
print(d[3]) #raises keyerror
다음과 같은 기본 명령어에 인수를 지정하는 것을 항상 기억하십시오.
d = defaultdict(int)
기본 dict 도구는 Python의 컬렉션 클래스에 있는 컨테이너입니다.일반 사전(dict) 컨테이너와 비슷하지만 한 가지 차이점이 있습니다.값 필드의 데이터 유형은 초기화 시 지정됩니다.
예:
from collections import defaultdict
d = defaultdict(list)
d['python'].append("awesome")
d['something-else'].append("not relevant")
d['python'].append("language")
for i in d.items():
print i
인쇄할 내용:
('python', ['awesome', 'language'])
('something-else', ['not relevant'])
간단히 말해서:
defaultdict(int)
int 인수는 값이 int 유형이 될 것임을 나타냅니다.
defaultdict(list)
인수 목록은 값이 목록 유형임을 나타냅니다.
저는 스위치 케이스 문 대신에 사용하는 것이 가장 좋다고 생각합니다.다음과 같은 스위치 케이스 설명이 있다고 가정해 보십시오.
option = 1
switch(option) {
case 1: print '1st option'
case 2: print '2nd option'
case 3: print '3rd option'
default: return 'No such option'
}
.switch
python에서 사용할 수 있는 case 문.다음을 사용하여 동일한 작업을 수행할 수 있습니다.defaultdict
.
from collections import defaultdict
def default_value(): return "Default Value"
dd = defaultdict(default_value)
dd[1] = '1st option'
dd[2] = '2nd option'
dd[3] = '3rd option'
print(dd[4])
print(dd[5])
print(dd[3])
인쇄:
Default Value
Default Value
3rd option
위의 스니펫에서dd
에는 키 4 또는 5가 없으므로 도우미 기능에서 구성한 기본값이 출력됩니다.이것은 원시 사전보다 훨씬 좋습니다.KeyError
키가 없는 경우 던집니다.이것으로부터 명백한 것은defaultdict
것을 수 .if-elif-elif-else
블록들
이 사이트에서 저에게 많은 인상을 남긴 또 다른 좋은 예는 다음과 같습니다.
>>> from collections import defaultdict
>>> food_list = 'spam spam spam spam spam spam eggs spam'.split()
>>> food_count = defaultdict(int) # default value of int is 0
>>> for food in food_list:
... food_count[food] += 1 # increment element's value by 1
...
defaultdict(<type 'int'>, {'eggs': 1, 'spam': 7})
>>>
다음 이외의 항목에 액세스하려고 하면eggs
그리고.spam
우리는 0을 셀 것입니다.
없이.defaultdict
보이지 않는 키에 새 값을 할당할 수 있지만 수정할 수는 없습니다.예:
import collections
d = collections.defaultdict(int)
for i in range(10):
d[i] += i
print(d)
# Output: defaultdict(<class 'int'>, {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9})
import collections
d = {}
for i in range(10):
d[i] += i
print(d)
# Output: Traceback (most recent call last): File "python", line 4, in <module> KeyError: 0
표준 사전에는 값을 검색하고 값이 없는 경우 기본값을 설정하기 위한 메서드 setdefault()가 포함되어 있습니다.반대로 defaultdict는 컨테이너가 초기화될 때 호출자가 기본값을 앞으로 지정할 수 있도록 합니다.
import collections
def default_factory():
return 'default value'
d = collections.defaultdict(default_factory, foo='bar')
print 'd:', d
print 'foo =>', d['foo']
print 'bar =>', d['bar']
이것은 모든 키가 동일한 기본값을 갖는 것이 적절한 한 잘 작동합니다.목록, 집합 또는 int와 같은 값을 집계하거나 누적하는 데 사용되는 유형이 기본값인 경우 특히 유용할 수 있습니다.표준 라이브러리 설명서에는 이러한 방식으로 defaultdict를 사용하는 몇 가지 예가 포함되어 있습니다.
$ python collections_defaultdict.py
d: defaultdict(<function default_factory at 0x100468c80>, {'foo': 'bar'})
foo => bar
bar => default value
#dictinary and defaultdict
normaldictionary=dict()
print(type(normaldictionary))
#print(normaldictionary["keynotexisit"])
#Above normal dictionary give an error as key not present
from collections import defaultdict
defaultdict1=defaultdict()
print(type(defaultdict1))
#print(defaultdict1['keynotexisit'])
######################################
from collections import defaultdict
default2=defaultdict(int)
print(default2['keynotexist'])
https://msatutorpy.medium.com/different-between-dictionary-and-defaultdictionary-cb215f682971
설명서와 설명은 거의 자명합니다.
http://docs.python.org/library/collections.html#collections.defaultdict
인수로 전달된 형식 함수(int/str 등)는 딕트에 키가 없는 지정된 키의 기본값을 초기화하는 데 사용됩니다.
언급URL : https://stackoverflow.com/questions/5900578/collections-defaultdict-difference-with-normal-dict
'programing' 카테고리의 다른 글
C#에서 두 개 이상의 바이트 배열을 결합하는 가장 좋은 방법 (0) | 2023.05.23 |
---|---|
쿼리 계획에서 "비트맵 힙 검사"란 무엇입니까? (0) | 2023.05.23 |
VBA 메시지 상자에서 선택 가능한 텍스트 (0) | 2023.05.23 |
Documents 폴더에 파일이 있는지 확인하는 방법은 무엇입니까? (0) | 2023.05.23 |
Excel 테이블에서 SQL 쿼리를 실행하는 방법은 무엇입니까? (0) | 2023.05.23 |