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