如何增加段落?

在很长一段时间没有使用 Python 之后,我现在重新开始使用它,并且非常喜欢它。然而,我发现自己一次又一次地遇到一种模式。我一直在想,一定有更好的方式来表达我想要的东西,而且我可能做错了。

我写的代码是这样的:

# foo is a dictionary
if foo.has_key(bar):
foo[bar] += 1
else:
foo[bar] = 1

我在程序里写了很多。我的第一反应是将它推出到一个 helper 函数,但是通常 python 库已经提供了类似的内容。

我是不是忽略了一些简单的语法技巧? 或者这就是应该做的事情?

59350 次浏览

使用 defaultdict:

from collections import defaultdict


foo = defaultdict(int)
foo[bar] += 1

在 Python > = 2.7中,还有一个单独的 柜台类用于这些目的。对于 Python 2.5和2.6,您可以使用它的 备份版本

对于 Python > = 2.5,您可以执行以下操作:

foo[bar] = 1 if bar not in foo else foo[bar]+1

您还可以在异常处理中利用控制结构。当您尝试为不存在的键赋值时,字典会引发 KeyError异常:

my_dict = {}
try:
my_dict['a'] += 1
except KeyError, err:    # in 2.6: `except KeyError as err:`
my_dict['a'] = 1

dictget()方法接受一个可选的第二个参数,如果找不到请求的键,可以使用该参数提供默认值:

foo[bar] = foo.get(bar, 0) + 1

我做了一些时间比较。几乎相等。一行的 .get()命令是最快的。

产出:

get 0.543551800627
exception 0.587318710994
haskey 0.598421703081

密码:

import timeit
import random


RANDLIST = [random.randint(0, 1000) for i in range(10000)]


def get():
foo = {}
for bar in RANDLIST:
foo[bar] = foo.get(bar, 0) + 1




def exception():
foo = {}
for bar in RANDLIST:
try:
foo[bar] += 1
except KeyError:
foo[bar] = 1




def haskey():
foo = {}
for bar in RANDLIST:
if foo.has_key(bar):
foo[bar] += 1
else:
foo[bar] = 1




def main():
print 'get', timeit.timeit('get()', 'from __main__ import get', number=100)
print 'exception', timeit.timeit('exception()', 'from __main__ import exception', number=100)
print 'haskey', timeit.timeit('haskey()', 'from __main__ import haskey', number=100)




if __name__ == '__main__':
main()

我不知道这是如何尝试的,但如果您需要附加的项目,在帝克键..。

indicatorDict = {}
indicatorDict[0] = 'Langford'
indicatorDict[1] = 'Esther'
indicatorDict[3] = 14

在它后面添加项,可以是迭代的,也可以是其他类型的:

indicatorDict[0] = np.append(indicatorDict[0],'Auditorium')
indicatorDict[1] = np.append(indicatorDict[1],'Duflo')
indicatorDict[3] = np.append(indicatorDict[3],'November')

打印..。

{0: array(['Langford', 'Auditorium'], dtype='<U10'),
1: array(['Esther', 'Duflo'], dtype='<U6'),
3: array(['14', 'November'], dtype='<U11')}

我避免了第三个关键字,以表明,如果需要的关键字可以从一个步骤跳到另一个... :) 希望能有帮助!