Python defaultdict的变体,用于仅赋值一次
我正在尝试创建一个单词字典,将单词哈希为整数,以便进一步处理。是否有一个Python defaultdict的变体,用于仅赋值一次,python,performance,python-2.7,python-3.x,dictionary,Python,Performance,Python 2.7,Python 3.x,Dictionary,我正在尝试创建一个单词字典,将单词哈希为整数,以便进一步处理。是否有一个defaultdict的变体,我可以使用它来避免检查(如果单词不在wordid中)。这是一个非常大的文件,需要一种节省时间的方法 wordid=defaultdict(int) totaluniquewords = 0 for word in sentencewords: if word not in wordid: totaluniquewords+=1 wordid[word
defaultdict
的变体,我可以使用它来避免检查(如果单词不在wordid中)。这是一个非常大的文件,需要一种节省时间的方法
wordid=defaultdict(int)
totaluniquewords = 0
for word in sentencewords:
if word not in wordid:
totaluniquewords+=1
wordid[word]=totaluniquewords
以下是一种更简单、更快捷的方式来获得您想要的:
from itertools import count
wordid = dict(zip(set(sentencewords), count(1)))
这将使用集合
获取语句词
中的唯一词,将每个唯一词与count()
(向上计数)中的下一个值配对,并根据结果构建词典
如果单词不在wordid中,是否有一个defaultdict
的变体可以用来避免检查
是的,只需将itertools.count()传递给它的构造函数:
Python2中的itertools.count().next
解释
defaultdict
的第一个参数是可调用的。当您尝试获取不存在的键时,它会调用这个不带参数的callable并返回结果。结果也存储在defaultdict中–当您再次尝试获取该项时,它已经存在,并且您将获得与以前相同的值
itertools.count()
返回从0计数到无穷大的迭代器
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
所以,基本上,itertools.count()。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>是可调用的,每次调用时都返回下一个自然数。你为什么要这样做?!为什么不干脆wordid[word]+=1
?或者使用计数器
!我不算发生的次数。我给单词分配整数以唯一标识单词soh。。。那么,为什么不把单词放在一个集合中,然后把它放到一个列表中,然后使用索引呢?例如:dict(枚举(set(sentencewords)))
?这将为每个唯一的单词提供一个整数,如果需要({v:k代表k,v in d.items()}
),您可以轻松地反转字典,因为值也是唯一的。我认为,defaultdict
根本不适合这样做。这不仅仅是一句话。这是一个句子流,像百万那么多?在[default]dict
或set
中的成员资格测试是O(1)
,因为底层的哈希表实现,所以我不认为word not in wordid
是一个瓶颈。这很简单,但可以使用explanation@jonrsharpe:这对我来说是不言自明的,我不知道我可以添加什么解释。count
做什么?\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu下一步做什么?将其用作defaultdict
的参数的结果是什么?它在2.x中根本不起作用?代码转储本身,不管它是否工作,很少是高质量的答案。
>>> from collections import defaultdict
>>> from itertools import count
>>> dct = defaultdict(count().__next__)
>>> dct['anything']
0
>>> dct['test']
1