Python 如何添加或增加字典条目?
在长期缺席之后,我现在正在重新接触Python,并热爱它。然而,我发现自己一次又一次地遇到了一种模式。我一直在想,一定有更好的方式来表达我的想法,而且我可能用了错误的方式 我正在编写的代码的格式如下:Python 如何添加或增加字典条目?,python,syntax,Python,Syntax,在长期缺席之后,我现在正在重新接触Python,并热爱它。然而,我发现自己一次又一次地遇到了一种模式。我一直在想,一定有更好的方式来表达我的想法,而且我可能用了错误的方式 我正在编写的代码的格式如下: # foo is a dictionary if foo.has_key(bar): foo[bar] += 1 else: foo[bar] = 1 我在我的程序中写了很多。我的第一个反应是将它推出一个helper函数,但python库通常已经提供了类似的东西 是否有一些简单的小语法技
# foo is a dictionary
if foo.has_key(bar):
foo[bar] += 1
else:
foo[bar] = 1
我在我的程序中写了很多。我的第一个反应是将它推出一个helper函数,但python库通常已经提供了类似的东西
是否有一些简单的小语法技巧,我错过了?还是应该这样做?使用
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
dict
的方法采用可选的第二个参数,如果找不到请求的键,该参数可用于提供默认值:
foo[bar] = foo.get(bar, 0) + 1
我做了一些时间比较。几乎相等。不过,一行的
.get()
命令速度最快
输出:
get 0.543551800627
exception 0.587318710994
haskey 0.598421703081
代码:
我不知道这是如何尝试的,但如果您需要在dict键中附加项
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')}
{0:array(['Langford','Auditorium',],dtype='作为旁白,你可以说if-bar-in-foo:
而不是if-foo.has-u-key(bar):
@J.F.Sebastian:+1用于使用正则表达式:-)我之所以使用has-u-key是因为我想(我猜错了)它将使用哈希函数来查找密钥,而不是在列表中搜索,因此效率更高。感谢您的提示-我将相应地调整我的编码。4年后,但我认为这对于那些可能最终从谷歌(如我)来到这里的人来说很重要:如果dict中的键
实际上比d更有效
而且概念上更好。集合。计数器在2.7
谢谢!我不知道defaultdict。这正是我想要的。仅仅因为异常处理可以用于控制流并不意味着它应该。好吧,做一些类似dict.has_key(key)的事情实际上尝试访问密钥,如果捕获到异常,则返回False。虽然有效,但这并不比OP的代码更简洁易读。@sventechie。我认为您可能对可读性和Pythonic有一个非常个人的定义。我没有否决它,但我猜最初的downvoter这么做是因为它违反了DRY规则(不要重复你自己)原则:“foo”和“bar”都被提到两次。@Tamas:好吧,OPs版本分别提到了这三次:)@Tamas…这似乎是对DRY原则的一个相当极端的解释…我通常在重复逻辑的上下文中看到它,而不是变量名!这是我的书中的一个很好的答案,因为它清晰地表达了逻辑,并且可以适应许多场景(任何默认值,任何要执行的函数)这比公认的答案要好,不需要导入。有趣-喜欢看一些测试,尽管你测量的差异很小!我想知道它们会受到多少重复的影响?我的预测:当foo[bar]时,异常版本会表现最好+=1通常成功增加重复项可提高异常代码的性能。将RANDLIST更改为[random.randint(0,100),以生成范围内的i(10000)]:获取0.0955109596252异常0.06258893013 haskey 0.0973930358887这里的比较结果如何?
{0: array(['Langford', 'Auditorium'], dtype='<U10'),
1: array(['Esther', 'Duflo'], dtype='<U6'),
3: array(['14', 'November'], dtype='<U11')}