2016-11-15 1 views
1

주어진 문자열에서 단어 빈도를 계산하기 위해 사전을 사용하려고했습니다. 말 : 사전 이해력이있는 단어 빈도

s = 'I ate an apple a big apple' 

내가 아마 collections.Counter를 사용하는 것입니다 단어 빈도를 계산하는 가장 좋은 방법을 알고 있습니다. 그러나 사전 통역을 사용하여이 문제를 해결할 수 있는지 알고 싶습니다. (사전 이해없이)

내 원래 방법이었다

dict = {} 
for token in s.split(" "): 
    dict[token] = dict.get(token, 0) + 1 

하고 그것을 잘 작동합니다 :

dict 
{'I': 1, 'a': 1, 'an': 1, 'apple': 2, 'ate': 1, 'big': 1} 

내가

dict = {} 
dict = {token: dict.get(token, 0) + 1 for token in s.split(" ")} 

처럼,이에 대한 사전 이해를 사용하려고 그러나 이것은 효과가 없었습니다.

dict 
{'I': 1, 'a': 1, 'an': 1, 'apple': 1, 'ate': 1, 'big': 1} 

사전 이해력에 문제가 있습니까? 내가 이해할 때마다 dict.get('apple', 0라고 불릴 때마다 그 자체를 사용했기 때문에, 나는 0을 얻을 것인가? 그러나 나는 이것을 테스트하는 방법을 모른다. 그래서 나는 100 % 확실하지 않다.

P. 어떤 차이가 있다면 파이썬 3을 사용하고 있습니다.

+2

이것은'collections.Counter' (dict 하위 유형)가 오래 전에 풀었던 것입니다. –

+1

내장되어 있기 때문에 변수 이름으로 dict를 사용하지 않을 것입니다. 이렇게하면 무언가가 깨질 수 있습니다 – e4c5

+1

변수'dict' isn 이해력이 완전히 계산 될 때까지 업데이트되지 않으므로'dict.get (token, 0)'을 사용하면 이전 줄의 빈 사전과의 컨설팅 만 수행됩니다. – khelwood

답변

1

코드 작업을 통해 작업을 수행하면 무엇이 잘못되었는지 알 수 있습니다.

먼저 dict을 빈 dict로 설정하십시오. (주석에서 언급했듯이, 자신의 변수 이름으로 사용하는 것은 좋지 않습니다. 그러나 여기에는 문제가 없습니다.)

두 번째로, 당신의 사전 이해력이 평가됩니다. 이 시점에서 이름 dict은 여전히 ​​빈 dict를 나타냅니다. 따라서 언제든지 dict.get(whatever, 0)을 할 때마다 항상 기본값을 갖게됩니다.

마지막으로 채워진 dict은 dict이라는 이름으로 재 할당되어 이전에 있었던 빈 것으로 대체됩니다.

1

또한 같은 list.count()을 사용할 수 있습니다 작동하도록 사전 이해를 위해

s = 'I ate an apple a big apple' 

print {token: s.split().count(token) for token in set(s.split())} 
0

, 당신은 자체 내부의 이해에 대한 참조가 필요합니다. 이해력이 건설되고 참조 '__me__'같은 것은이 있다면 이런 식으로 뭔가가

{token: __me__.get(token, 0) + 1 for token in s.split(" ")} 

을 작동합니다. 파이썬 3에는 문서화 된 방법이 없다.

this answer에 따르면 문서화되지 않은 "구현 아티팩트"(Python 사용자가 의존해서는 안 됨)는 Python 2.5, 2.6에서 자체 참조 목록 이해를 작성하는 데 사용할 수 있습니다. 파이썬 3에서도 사전 보충을위한 유사한 해킹이 존재할 수도 있습니다.