[英]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.