programing

collections.defaultdict는 어떻게 작동합니까?

randomtip 2022. 12. 1. 23:32
반응형

collections.defaultdict는 어떻게 작동합니까?

python docs의 예를 읽어봤지만 이 방법이 무엇을 의미하는지 알 수 없습니다.누가 좀 도와줄래요?다음은 python 문서의 두 가지 예입니다.

>>> from collections import defaultdict

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]

그리고.

>>> 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★★★★★★★★★★★★★★★★?

Python 은 Python을 .KeyError현재 사전에 없는 키를 사용하여 항목을 가져오려고 할 경우.defaultdict반대로, 액세스하려고 하는 아이템이 작성됩니다(물론 아직 존재하지 않는 경우).이러한 "기본" 항목을 만들기 위해 생성자에게 전달되는 함수 개체를 호출합니다(더 정확히는 함수 개체와 유형 개체를 포함하는 임의 "호출 가능한" 개체).예에서는 기본 .int() 객체 정수 '정수'를 0에서는 기본 되어 있습니다.list()새 빈 목록 개체를 반환합니다.

defaultdict 수 없는 대신 수 을 의미합니다.KeyError을 사용하다defaultdict는 defaultdict입니다.

예를 들어 다음과 같습니다.

somedict = {}
print(somedict[3]) # KeyError

someddict = defaultdict(int)
print(someddict[3]) # print int(), thus 0

defaultdict(디폴트)

"에는 값을 않을 하기 위한 되어 있습니다표준 사전에는 값을 가져와 값이 존재하지 않을 경우 기본값을 설정하기 위한 setdefault() 메서드가 포함되어 있습니다. by by by by bydefaultdict이렇게'는 '이러다'라고 합니다.

Doug Hellmann이 Python Standard Library에서 정의한 대로 예제를 통해 설명합니다.

defaultdict 사용방법

defaultdict 가져오기

>>> from collections import defaultdict

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})

기본값 덮어쓰기 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)을 초기화해야 합니다.이는 수동으로 수행하는 것이 비교적 쉽지만 defaultdict 유형은 이러한 종류의 작업을 자동화하고 단순화합니다.defaultdict는 일반 dict와 동일하게 동작하지만 인수를 사용하지 않고 존재하지 않는 키의 기본값을 제공하는 함수("default factory")로 초기화됩니다.

defaultdict는 KeyError를 발생시키지 않습니다.존재하지 않는 키는 기본 공장에서 반환된 값을 받습니다.

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

다음은 defaultdict를 사용하여 복잡성을 줄이는 방법의 다른 예입니다.

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))

결론적으로 사전이 필요하고 각 요소의 값이 기본값으로 시작되어야 할 때는 항상 defaultdict를 사용합니다.

defaultdicts에 대한 자세한 설명은 http://ludovf.net/blog/python-collections-defaultdict/ 에서 확인할 수 있습니다.

기본적으로 int 및 list 파라미터는 사용자가 패스하는 함수입니다.Python은 함수 이름을 인수로 받아들입니다.int는 기본적으로 0을 반환하고 list는 괄호로 호출하면 빈 목록을 반환합니다.

에서는, 이에서 「」를 하려고 하고 있는 , 「」를 합니다.d[a]키 m, s, i 및 p만이 존재하고 키 a가 초기화되지 않았기 때문에 오류(KeyError)가 발생합니다.디폴트딕트초기화되지 않은 키를 사용하려고 하면 단순히 전달된 함수를 호출하고 반환값을 새 키의 값으로 할당합니다.

동작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리스트 컨스트럭터는 1회만 호출되며,dict.setdefault목록 생성자는 더 자주 호출됩니다(단, 필요한 경우 이를 방지하기 위해 코드를 다시 작성할 수 있습니다).

퍼포먼스에 대한 고려가 있다고 주장하는 사람도 있습니다만, 이 주제는 지뢰밭입니다.이 게시물은 예를 들어 defaultdict를 사용해도 성능이 크게 향상되지 않음을 보여줍니다.

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})

이것이 defaultdict의 가장 일반적인 사용법입니다(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인치: defaultdict를 서브클래스 할 수도 있습니다.

class MyDict(defaultdict):
    def __missing__(self, key):
        value = [None, None]
        self[key] = value
        return value

매우 복잡한 경우에 유용할 수 있습니다.

다음과 같은 경우 defaultdict에서도 키 오류가 발생할 수 있습니다.

from collections import defaultdict
d = defaultdict()
print(d[3]) #raises keyerror

defaultdict에는 항상 다음과 같은 인수를 지정합니다.

d = defaultdict(int)

defaultdict 도구는 Python 컬렉션 클래스의 컨테이너입니다.일반적인 사전(딕트) 컨테이너와 비슷하지만 다음과 같은 한 가지 차이점이 있습니다.값 필드의 데이터 유형은 초기화 시 지정됩니다.

예를 들어 다음과 같습니다.

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)인트라 인트

defaultdict(list)인수 목록은 값이 목록 유형임을 나타냅니다.

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

스위치 케이스 스테이트먼트 대신 사용하는 것이 가장 좋다고 생각합니다.다음과 같은 스위치 케이스 스테이트먼트가 있다고 가정합니다.

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비단뱀 같은 수 요.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

의 위 in in 。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 ★★★★★★★★★★★★★★★★★」spam0으로 하다

표준 딕셔너리에는 값을 취득하여 값이 존재하지 않는 경우 기본값을 확립하기 위한 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 등)는, 키가 dict 에 없는 임의의 키의 디폴트치를 초기화하기 위해서 사용됩니다.

언급URL : https://stackoverflow.com/questions/5900578/how-does-collections-defaultdict-work

반응형