如何简化分类器代码

时间:2014-11-27 13:11:02

标签: python dictionary classification

我是编程新手,但我认为必须有一个更优雅的解决方案才能完成我应得的任务。

我正在创建一个分类器,行中的一些数据是字符串。为了处理这个问题,我正在为每个属性创建字典,然后计算每个属性发生的概率。

我的问题是这个。

创建关联变量后,我的代码的snipet看起来像这样。

            if row[1] in workclass_dict_u:
                    workclass_dict_u[row[1]] += 1
            else:
                workclass_dict_u[row[1]] = 1


            if row[5] in marital_dict_u:
                    marital_dict_u[row[5]] += 1
            else:
                marital_dict_u[row[5]] = 1

这又重复了几次,我想知道是否有办法用更少的行编写所有这些代码。也许有一个我们没有在课堂上讨论的概念,我渴望学习更简洁和准确的代码。

感谢您的回复。我知道每个人都很忙,如果有人能花时间指出我正确的方向,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

看起来您正在寻找defaultdict

>>> from collections import defaultdict
>>> dct = defaultdict(int)
>>> dct['foo'] +=1 # no explicit init needed
>>> dct['foo'] +=1
>>> dct['foo']
2

消除了你对“如果已经在dict / else”条款中的需要。

另一种方法是使用标准字典的.setdefault方法:

  

builtins.dict实例的setdefault(...)方法       D.setdefault(k [,d]) - > D.get(k,d),如果k不在D

中,也设置D [k] = d

答案 1 :(得分:0)

您可以使用标准词典的get方法

if row[1] in workclass_dict_u:
    workclass_dict_u[row[1]] += 1
else:
    workclass_dict_u[row[1]] = 1

变为

workclass_dict_u[row[1]] = workclass_dict_u.get(row[1],0)+1

您可以将此行为封装在辅助函数

def incr_dict(d,k,n=1):
    d[k] = d.get(k,0)+n

因为d是一个可变对象,该函数通过其副作用工作,并返回(隐式)None。 (NB n=1是一个默认的可选参数,当您使用2个参数调用该函数时它等于1,并且当您使用3个参数时,它具有您指定的值(甚至是负数)

另一种可能性是使用collections模块中的Counter,请参阅上面优秀参考中的示例,但根据您的需要,incr_dict函数可能是合适的。