python koan - 将这两个衬垫简化为一个

时间:2013-04-20 21:35:48

标签: python

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

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

令我困扰的是,增加字典的小语句需要两行。我确信这个问题也困扰了某些人。

3 个答案:

答案 0 :(得分:3)

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

...但是没有错误,因为该语句需要两行。有一些python coding guidelines (PEP8),他们强烈鼓励核心可读性。通过将这些语句放在一行中,可以降低可读性。

来自PEP8

  

虽然有时可以在小身体上放置if / for / while   同一行,永远不要为多子句语句执行此操作。还要避免   折叠如此长的线条!

答案 1 :(得分:3)

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

这主要使用dict.update来使用另一个字典中的值更新字典。而另一个字典是使用字典理解构建的。不幸的是,要获得my_dict[n] += 1效果,我们必须在表达式中再次明确地读取该值。

但是,如果它比使用简单清除 for循环更好,那么我会认为很多

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

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

或者您只是为每个添加1,您可以直接传递可迭代的exceptions

my_dict.update(exceptions)

这样做的好处是,my_dict中不存在的异常会自动初始化。要从现有字典创建计数器,只需将原始字典传递给Counter构造函数:

from collections import Counter
my_dict = Counter(my_dict)

答案 2 :(得分:2)

使用collections.Counter

import collections
my_dict = collections.Counter(exceptions)

或者,如果已将my_dict定义为dict

my_dict = collections.Counter(my_dict)
my_dict.update(exceptions)