像列表/字典理解這樣的理解表達式是一個構建器表達式,並且該對象在表達式完全評估之前不會構造。在符號名稱後面跟隨生成字典的引用。
在您的特定示例中,您指的是符號li
,它指的是對象空字典。所以表達式的評估過程中,li
繼續指向一個空的字典這意味着,字典理解,可以等效寫成
li = {token: 1 if not token in {} else l{}[token] + 1 for token in tokens }
或簡化爲成員測試上一個空的字典永遠是假的
li = {token: 1 for token in tokens }
您需要的是已有的庫實用程序或基於狀態的解決方案。
幸運的是,標準庫collections提供了一個名爲counter函數的編寫和爲此而設計的
這隻會您的功能
def tf(tokens):
from collections import Counter
""" Compute TF
Args:
tokens (list of str): input list of tokens from tokenize
Returns:
dictionary: a dictionary of tokens to its TF values
"""
return Counter(tokens)
基於狀態的解決方案只需要爲每一個外部計數器獨特發生
def tf(tokens):
from collections import defaultdict
""" Compute TF
Args:
tokens (list of str): input list of tokens from tokenize
Returns:
dictionary: a dictionary of tokens to its TF values
"""
counter = defaultdict(int)
for token in tokens:
counter[token] += 1
return counter
或者如果您不打算使用defaultdict
def tf(tokens):
from collections import defaultdict
""" Compute TF
Args:
tokens (list of str): input list of tokens from tokenize
Returns:
dictionary: a dictionary of tokens to its TF values
"""
counter = {}
for token in tokens:
counter[token] = counter.get(token, 0) + 1
return counter
'itertools.Counter()object'?我認爲你的意思是'collections.Counter()' – Abhijit
@Ahhijit:我當然了。呃,甚至不知道爲什麼Chrome自動完成URL,我以前一定犯過錯誤。關閉網站搜索引擎! –
@Abhijit:bingo,[用變量名稱鍵添加項到詞典python](https://stackoverflow.com/a/12732835)已更正。 –