繁体   English   中英

使用列表推导向字典中的值添加一个

[英]Using list comprehension to add one to a value in a dictionary

我试图摆脱这种for循环,而是使用列表理解来提供相同的结果。

fd= nltk.FreqDist()
html = requests.get("http://www.nrc.nl/nieuws/2015/04/19/louise-gunning-vertrekt-als-voorzitter-bestuur-uva/")
raw = BeautifulSoup(html.text).text
for word in nltk.word_tokenize(raw):
    freqdist[word.lower()] += 1

我不确定是否有可能,但是由于+ = 1,所以无法使其正常工作。 我试过了:

[freqdist[word.lower()] +=1 for word in nltk.word_tokenize(raw)]

但这只会引发错误。 有人能指出我正确的方向吗?

如果要对现有列表/词典进行变异 ,则使用列表/词典理解被认为是不好的样式,因为它会创建不必要的废弃列表/词典。

确切地说,我在谈论以下内容:

>>> demo = ['a', 'b', 'c']
>>> freqdist = {'a': 0, 'b': 1, 'c': 2}
>>> [freqdist.__setitem__(key, freqdist[key] + 1) for key in demo]
[None, None, None]
>>> freqdist
{'a': 1, 'c': 3, 'b': 2}

正如您所看到的,做您描述的事情是可能的,但是那不是您应该做的,因为

  • 很难读
  • 它创建一个未使用的一次性列表[None, None, None]
  • 列表推导应用于构建您实际需要的新列表

用字典理解来创建新字典也很麻烦,因为不是每个值都应该递增(仅demo )。

可以

>>> demo = ['a', 'b', 'c']
>>> freqdist = {'a': 0, 'b': 1, 'c': 2}
>>> freqdist = {k:v + (k in demo) for k,v in freqdist.items()}
>>> freqdist
{'a': 1, 'c': 3, 'b': 2}

然而,我们现在拥有最理想的运行复杂性,因为在每一个关键freqdist我们做了O( len(demo) )为成员测试demo

可以使用demo set ,以将字典构建的复杂性降低到O( len(freqdist) ),但len(freqdist)demo的元素是唯一的。

>>> demo = set(['a', 'b', 'c'])
>>> freqdist = {'a': 0, 'b': 1, 'c': 2}
>>> freqdist = {k:v + (k in demo) for k,v in freqdist.items()}
>>> freqdist
{'a': 1, 'c': 3, 'b': 2}

我也不认为这种解决方案特别优雅。

总之,您的for循环非常好。 唯一好的替代方法是使用您更新的Counter对象:

>>> from collections import Counter
>>> demo = ['a', 'b', 'c']
>>> freqdist = Counter({'a': 0, 'b': 1, 'c': 2})
>>> freqdist.update(demo)
>>> freqdist
Counter({'c': 3, 'b': 2, 'a': 1})

这是我个人使用的解决方案。

这有效:

>>> txt = 'Hello goodbye hello GDby Dog cat dog'
>>> txt_new = txt.lower().split()
>>> print txt_new
['hello', 'goodbye', 'hello', 'gdby', 'dog', 'cat', 'dog']

现在使用collections

>>> import collections 
>>> collections.Counter(txt_new)
Counter({'hello': 2, 'dog': 2, 'gdby': 1, 'cat': 1, 'goodbye': 1})

如果您不允许使用collections.Counter则:

>>> {word: txt_new.count(word) for word in set(txt_new)}
{'goodbye': 1, 'dog': 2, 'hello': 2, 'gdby': 1, 'cat': 1}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM