1

我想把这两行代码合二为一。

for n in exceptions:
    my_dict[n] += 1

一个增加字典的小语句需要两行,这让我很困扰。我敢肯定,这个问题也曾困扰过某人。

4

3 回答 3

3
for n in exceptions: my_dict[n] += 1

...但是该语句采用两行这一事实并没有错。有一些 Python编码指南 (PEP8),它们强烈鼓励核心可读性。通过将这些语句放在一行中,您会降低可读性。

PEP8

虽然有时可以将带有小主体的 if/for/while 放在同一行,但切勿对多子句语句执行此操作。还要避免折叠这么长的线!

于 2013-04-20T21:39:20.763 回答
3
my_dict.update({n: my_dict[n] + 1 for n in exceptions})

这实质上是使用dict.update用另一个字典中的值更新字典。另一个字典是使用字典理解构建的。不幸的是,为了获得my_dict[n] += 1效果,我们必须在表达式中再次显式地读取值。

但是,如果它比为此使用简单明了的 for 循环更好,我会争论很多。

另一方面,由于您似乎只是在计算异常,您可能需要考虑为您的字典使用计数器。它本质上是一个改进的字典(意味着您可以像使用普通字典一样使用它),但它具有一些功能,使其在计算事物时非常完美。例如,您可以将上述语句简化为:

my_dict.update({n: 1 for n in exceptions})

或者当您只是1为每个添加时,您可以直接传递 iterable exceptions

my_dict.update(exceptions)

这也将具有my_dict自动初始化尚不存在的异常的好处。要从现有字典创建 Counter,只需将原始字典传递给 Counter 构造函数:

from collections import Counter
my_dict = Counter(my_dict)
于 2013-04-20T21:41:32.647 回答
2

使用collections.Counter

import collections
my_dict = collections.Counter(exceptions)

或者,如果my_dict已经定义为 a dict

my_dict = collections.Counter(my_dict)
my_dict.update(exceptions)
于 2013-04-20T21:50:33.103 回答