Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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 dict如何创建键或将元素附加到键?_Python_Python 2.7_Python 3.x_Dictionary - Fatal编程技术网

Python dict如何创建键或将元素附加到键?

Python dict如何创建键或将元素附加到键?,python,python-2.7,python-3.x,dictionary,Python,Python 2.7,Python 3.x,Dictionary,我有一本空字典。名称:dict\u x 它必须具有值为列表的键 从一个单独的迭代中,我获得一个键(例如:key\u 123)和一个项(一个元组),以放置在dict\u x的值key\u 123列表中 如果此键已存在,我想附加此项。 如果这个键不存在,我想用一个空列表创建它,然后附加到它,或者只是用一个元组创建它 将来,当这个键再次出现时,由于它存在,我希望再次追加该值 我的代码由以下内容组成: 获取键和值 查看dict\u x中是否存在非键 如果没有创建它:dict_x[key]=[] 之后:d

我有一本空字典。名称:
dict\u x
它必须具有值为列表的键

从一个单独的迭代中,我获得一个键(例如:
key\u 123
)和一个项(一个元组),以放置在
dict\u x
的值
key\u 123
列表中

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

将来,当这个键再次出现时,由于它存在,我希望再次追加该值

我的代码由以下内容组成:

获取键和值

查看
dict\u x
中是否存在

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

之后:
dict\u x[key]。追加(值)

这样做吗?我应该尝试使用
try/except
块吗?

使用:

帮助(dict.setdefault)

    setdefault(...)
        D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
您可以在
集合中使用

doc中的一个示例:

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
    d[k].append(v)
你可以用a来做这个

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

这比
setdefault
稍微有效一些,因为您不会创建新的列表,也不会使用这些列表。每次调用
setdefault
都将创建一个新列表,即使该项已存在于字典中。

以下是执行此操作的各种方法,以便您可以比较它的外观并选择您喜欢的内容。我以一种我认为最“蟒蛇式”的方式订购了它们,并评论了乍一看可能不明显的利弊:

使用
集合。defaultdict

import collections
dict_x = collections.defaultdict(list)

...

dict_x[key].append(value)
dict_x = {}

...

dict_x.setdefault(key, []).append(value)
dict_x = {}

...

try:
    values = dict_x[key]
except KeyError:
    values = dict_x[key] = []
values.append(value)
优点:可能是最好的表现。缺点:在Python2.4.x中不可用

使用
dict().setdefault()

import collections
dict_x = collections.defaultdict(list)

...

dict_x[key].append(value)
dict_x = {}

...

dict_x.setdefault(key, []).append(value)
dict_x = {}

...

try:
    values = dict_x[key]
except KeyError:
    values = dict_x[key] = []
values.append(value)
缺点:未使用的
list()
s的创建效率低下

使用
尝试。。。除了

import collections
dict_x = collections.defaultdict(list)

...

dict_x[key].append(value)
dict_x = {}

...

dict_x.setdefault(key, []).append(value)
dict_x = {}

...

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


您好,为什么您认为.setdefault会创建不必要的字典?我不认为
.setdefault()
会创建不必要的字典。我认为我在
.setdefault()
的第二个参数中创建了不必要的
列表(即
[]
),如果
键已经存在,则永远不会使用该列表。我可以使用
dict.setdefault()
(为了有效的密钥散列),并使用一个变量来重用未使用的
list
s,但这会增加几行代码。IIRC,在Python中,等式中的空列表在字节码级别被视为常量,但这需要字节码专家的一些确认(或者只使用disas模块)。使用
.setdefault
创建一个常规的
dict
,其中缺少键查找将导致
键错误
,而
集合。defaultdict(列表)< /代码>创建一个<代码> DICT<代码>,其中缺少的关键字查找将插入一个空的<代码>列表>代码>我认为您应该根据您的行为选择什么样的行为类似于Copyths.Debug在我自己的代码中,它有意想不到的副作用。例如,考虑下面的空闲Exchange:>>>>len(list_dict)0>>>len(list_dict[0])0>>>len(list_dict)1当Python调用默认值时,它似乎会将键添加到字典中,而无需您主动设置它,如果经常使用默认值,这将创建大量空列表。我将为字典使用自己的包装函数,效率很低,但希望更可预测。我以前是通过
dict_x[key]=[some_value]如果没有dict_x.就有dict_key(key)或者dict_x[key]+[some_value]
但是这个答案建议了一个更好的方法。事实上,它将
set()
作为参数,并允许您使用
add()
方法……您应该解释一下(非常小)在存在某些异常的情况下,这有一个优势;作为代码,不清楚为什么需要额外的答案。嗨,这只是一个没有额外导入的替代方案。这显然可以通过if语句来完成。我只是建议使用.get()的强大功能,而不是使用dict[].前两个答案提到了两种不同的无导入方式(尽管不是
dict.get
)。