Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何添加或增加字典条目?_Python_Syntax - Fatal编程技术网

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库通常已经提供了类似的东西 是否有一些简单的小语法技

在长期缺席之后,我现在正在重新接触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')}