2012-10-16 45 views
78

我是Python新手。我不仅学习它的功能,类型等,而且我正试图学习Pythonic方法来做事情,因此我的问题:Python字典如何创建键或追加键元素?

我有一个空的字典。名称:dict_x 它的键值是列表。

从一个单独的迭代中,我获得密钥(例如:key_123)和一个项目(元组),以在dict_x的值key_123列表放置。

如果这个键已经存在,我想追加这个项目。 如果这个键不存在,我想用一个空列表创建它,然后附加到它或者只是用一个元组创建它。

未来,当这个键再次出现时,因为它存在,我想要再次追加值。

我的代码组成的:

获取键和值。

看看是否不是密钥存在于dict_x

,如果没有创建它:dict_x[key] == []

算账:dict_x[key].append(value)

这是为了做到这一点?我应该尝试使用try/except块吗?

回答

126

使用dict.setdefault()

dic.setdefault(key,[]).append(value) 

帮助(dict.setdefault)

setdefault(...) 
     D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D 
+3

我使用'dict_x [关键] = [SOME_VALUE]如果不是dict_x.has_key(键)其他dict_x做到这一点[键] + [some_value]'但这个答案表明一个更好的方法。实际上,它将'set()'作为参数并允许您使用'add()'方法... –

7

可以在collections使用defaultdict

从文档的一个例子:

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] 
d = defaultdict(list) 
for k, v in s: 
    d[k].append(v) 
5

你可以使用这个defaultdict

d = defaultdict(list) 
d['key'].append('mykey') 

,因为你没有最终创建出你最终不会使用新的名单这是略高于setdefault更有效。每次拨打setdefault都会创建一个新列表,即使该项目已经存在于字典中。

30

以下是各种方法可以做到这一点,以便比较它的外观和选择你喜欢的东西。我已经下令他们的方式,我觉得是最“Python的”和评论的利弊可能不会第一眼是显而易见的:

使用collections.defaultdict

import collections 
dict_x = collections.defaultdict(list) 

... 

dict_x[key].append(value) 

优点:可能是最佳性能。缺点:在Python 2.4.x中不可用。

使用dict().setdefault()

dict_x = {} 

... 

dict_x.setdefault(key, []).append(value) 

缺点:低效闲置创造list() S的。

使用try ... except

dict_x = {} 

... 

try: 
    values = dict_x[key] 
except KeyError: 
    values = dict_x[key] = [] 
values.append(value) 

或者:

try: 
    dict_x[key].append(value) 
except KeyError: 
    dict_x[key] = [value] 
+0

您好,为什么您认为.setdefault会创建不必要的字典? – Phil

+1

我不认为'.setdefault()'会创建不必要的字典。我认为*如果'key'已经存在,我会在'.setdefault()'的第二个参数中创建不需要的'list'(即'[]')我可以使用'dict.setdefault()'(为了有效的密钥哈希),并且使用一个变量来重用未使用的'list's,但是增加了几行代码。 – antak

+0

IIRC,在Python中,一个相等的空列表在字节码级别被认为是一个常量,但这需要一个字节码大师的确认(或者只是使用disas模块)。 – gaborous