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

2025-03-04 08:23:00
admin
原创
91
摘要:问题描述:我有一本空字典。名称:dict_x它有键,键值为列表。从单独的迭代中,我获得一个键(例如key_123:)和一个项(一个元组)以放置在dict_x值列表中key_123。如果此键已存在,我想附加此项。如果此键不存在,我想用一个空列表创建它,然后附加到它,或者只是用其中的元组创建它。将来当这个键再次出...

问题描述:

我有一本空字典。名称:dict_x
它有键,键值为列表。

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

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

将来当这个键再次出现时,因为它存在,所以我希望再次附加该值。

我的代码包括以下内容:

获取密钥和值。

检查 中是否存在NOTdict_x

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

然后:dict_x[key].append(value)

这是可行的方法吗?我应该尝试使用try/except块吗?


解决方案 1:

使用dict.setdefault()

dict.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

解决方案 2:

以下是各种实现方法,您可以比较它们的外观并选择您喜欢的。我以我认为最“pythonic”的方式对它们进行了排序,并评论了乍一看可能不明显的优缺点:

使用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]

解决方案 3:

您可以为此使用默认字典。

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

这比 稍微高效一些,setdefault因为你不会创建最终不使用的新列表。每次调用setdefault都会创建一个新列表,即使该项目已经存在于字典中。

解决方案 4:

您可以在中使用defaultdictcollections

来自文档的一个例子:

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

解决方案 5:

dictionary['key'] = dictionary.get('key', []) + list_to_append

解决方案 6:

总结

更长更富有表现力的方法似乎也更有效。

if key in dest:
    dest[key].append(value)
else:
    dest[key] = [value]

较长的答案

我写了一些 python 代码来检查所提出的方法在性能方面是否确实是最好的。

d1 = {}
d2 = {}

def add1(key, value, dest):
        dest.setdefault(key, []).append(value)
            
def add2(key, value, dest):
    if key in dest:
        dest[key].append(value)
    else:
        dest[key] = [value]

这导致

%timeit add1('a', 1.1, d1)
  96.2 ns ± 0.0972 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
%timeit add2('a', 1.1, d2)
  89.1 ns ± 0.111 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)

在我的 Python 设置 ( 3.10.4 (main, Apr 2 2022, 09:04:19) [GCC 11.2.0]) 上测试了执行 Jupyter NB。

值得指出的是,在这种情况下,选择更长、更具表现力的方法也会对性能产生积极影响。

解决方案 7:

死灵发布:

如果默认情况下只有一个键应该是数组,那么这defaultdict可能是过度的/不想要的,并且以后会导致奇怪的错误。

建议的替代方案:在开头添加一个空键,如果结尾仍然为空,则将其删除。

喜欢:

d[key] = []

if condition:
  d[key].append(value)

# remove if still empty:
if not d[key]:
   del d[key]

非常冗长,但没有以任何其他方式触及字典......

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3970  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2740  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   79  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   87  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   74  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用