我是编程新手,但我认为必须有一个更优雅的解决方案才能完成我应得的任务。
我正在创建一个分类器,行中的一些数据是字符串。为了处理这个问题,我正在为每个属性创建字典,然后计算每个属性发生的概率。
我的问题是这个。
创建关联变量后,我的代码的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
这又重复了几次,我想知道是否有办法用更少的行编写所有这些代码。也许有一个我们没有在课堂上讨论的概念,我渴望学习更简洁和准确的代码。
感谢您的回复。我知道每个人都很忙,如果有人能花时间指出我正确的方向,我将不胜感激。
答案 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
函数可能是合适的。